aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2012-11-22 19:56:47 +0000
committerJoseph Myers <joseph@codesourcery.com>2012-11-22 19:56:47 +0000
commit0a42601f272ea962b200d452a54e0ca374163f60 (patch)
tree79f2d88d56d8c44a291ac0e235ace15b8a3cfe6d
parent79c9b9feb45d175d4a394edd9ecf89cde97890c4 (diff)
downloadglibc-0a42601f272ea962b200d452a54e0ca374163f60.tar
glibc-0a42601f272ea962b200d452a54e0ca374163f60.tar.gz
glibc-0a42601f272ea962b200d452a54e0ca374163f60.tar.bz2
glibc-0a42601f272ea962b200d452a54e0ca374163f60.zip
Fix ldbl-128ibm atanl spurious underflows (bug 14871).
-rw-r--r--ChangeLog5
-rw-r--r--NEWS2
-rw-r--r--math/libm-test.inc8
-rw-r--r--sysdeps/ieee754/ldbl-128ibm/s_atanl.c16
4 files changed, 30 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 4a6eee20a7..56c1af121c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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)).
diff --git a/NEWS b/NEWS
index 51de010ebb..e8c44adc25 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 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;