From: Joseph Myers Date: Thu, 22 Nov 2012 19:56:47 +0000 (+0000) Subject: Fix ldbl-128ibm atanl spurious underflows (bug 14871). X-Git-Tag: glibc-2.17~116 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0a42601f272ea962b200d452a54e0ca374163f60;p=thirdparty%2Fglibc.git Fix ldbl-128ibm atanl spurious underflows (bug 14871). --- diff --git a/ChangeLog b/ChangeLog index 4a6eee20a71..56c1af121ca 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,10 @@ 2012-11-22 Joseph Myers + [BZ #14871] + * sysdeps/ieee754/ldbl-128ibm/s_atanl.c (__atanl): Return the + input for small inputs. Return +/- pi/2 for large inputs. + * math/libm-test.inc (atan_test): Add more tests. + * sysdeps/generic/unwind-dw2-fde-glibc.c (_Unwind_IteratePhdrCallback): Declare P_DYNAMIC with __attribute__ ((unused)). diff --git a/NEWS b/NEWS index 51de010ebb5..e8c44adc252 100644 --- a/NEWS +++ b/NEWS @@ -21,7 +21,7 @@ Version 2.17 14638, 14645, 14648, 14652, 14660, 14661, 14669, 14672, 14683, 14694, 14716, 14719, 14743, 14767, 14783, 14784, 14785, 14793, 14796, 14797, 14801, 14805, 14807, 14809, 14811, 14815, 14821, 14822, 14824, 14828, - 14831, 14835, 14838, 14856, 14863, 14865, 14866, 14868, 14869. + 14831, 14835, 14838, 14856, 14863, 14865, 14866, 14868, 14869, 14871. * Port to ARM AArch64 contributed by Linaro. diff --git a/math/libm-test.inc b/math/libm-test.inc index b96f1bf92e5..cae2de43bb1 100644 --- a/math/libm-test.inc +++ b/math/libm-test.inc @@ -1195,6 +1195,14 @@ atan_test (void) TEST_f_f (atan, 0.75L, 0.643501108793284386802809228717322638L); + TEST_f_f (atan, 0x1p-100L, 0x1p-100L); +#ifndef TEST_FLOAT + TEST_f_f (atan, 0x1p-600L, 0x1p-600L); +#endif +#if defined TEST_LDOUBLE && LDBL_MIN_EXP <= -16381 + TEST_f_f (atan, 0x1p-10000L, 0x1p-10000L); +#endif + END (atan); } diff --git a/sysdeps/ieee754/ldbl-128ibm/s_atanl.c b/sysdeps/ieee754/ldbl-128ibm/s_atanl.c index 779209d3d72..2a36d16bb41 100644 --- a/sysdeps/ieee754/ldbl-128ibm/s_atanl.c +++ b/sysdeps/ieee754/ldbl-128ibm/s_atanl.c @@ -199,6 +199,22 @@ __atanl (long double x) return atantbl[83]; } + if (k <= 0x3c800000) /* |x| <= 2**-55. */ + { + /* Raise inexact. */ + if (1e300L + x > 0.0) + return x; + } + + if (k >= 0x46c00000) /* |x| >= 2**109. */ + { + /* Saturate result to {-,+}pi/2. */ + if (sign) + return -atantbl[83]; + else + return atantbl[83]; + } + if (sign) x = -x;