diff options
author | Joseph Myers <joseph@codesourcery.com> | 2012-11-22 19:56:47 +0000 |
---|---|---|
committer | Joseph Myers <joseph@codesourcery.com> | 2012-11-22 19:56:47 +0000 |
commit | 0a42601f272ea962b200d452a54e0ca374163f60 (patch) | |
tree | 79f2d88d56d8c44a291ac0e235ace15b8a3cfe6d | |
parent | 79c9b9feb45d175d4a394edd9ecf89cde97890c4 (diff) | |
download | glibc-0a42601f272ea962b200d452a54e0ca374163f60.tar glibc-0a42601f272ea962b200d452a54e0ca374163f60.tar.gz glibc-0a42601f272ea962b200d452a54e0ca374163f60.tar.bz2 glibc-0a42601f272ea962b200d452a54e0ca374163f60.zip |
Fix ldbl-128ibm atanl spurious underflows (bug 14871).
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | NEWS | 2 | ||||
-rw-r--r-- | math/libm-test.inc | 8 | ||||
-rw-r--r-- | sysdeps/ieee754/ldbl-128ibm/s_atanl.c | 16 |
4 files changed, 30 insertions, 1 deletions
@@ -1,5 +1,10 @@ 2012-11-22 Joseph Myers <joseph@codesourcery.com> + [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)). @@ -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 b96f1bf92e..cae2de43bb 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 779209d3d7..2a36d16bb4 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; |