]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Fix ldbl-128ibm atanl spurious underflows (bug 14871).
authorJoseph Myers <joseph@codesourcery.com>
Thu, 22 Nov 2012 19:56:47 +0000 (19:56 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Thu, 22 Nov 2012 19:56:47 +0000 (19:56 +0000)
ChangeLog
NEWS
math/libm-test.inc
sysdeps/ieee754/ldbl-128ibm/s_atanl.c

index 4a6eee20a71a99e2d3972e1a924cf9598b39569f..56c1af121ca7654fd5275c2ef21ae8027eb8d55b 100644 (file)
--- 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 51de010ebb5d4273be4de2de3ab13076a683c414..e8c44adc252a13974109d551313c0169a923f58b 100644 (file)
--- 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.
 
index b96f1bf92e5cc161859fe38716ad5220186341d0..cae2de43bb1b9674dd7e10ebec40c1e7e4c6da57 100644 (file)
@@ -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);
 }
 
index 779209d3d72eddf6788e9e645ddb75e41624f7db..2a36d16bb410ab0a27e63c65ed6f28b2ff647694 100644 (file)
@@ -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;