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 4a6eee2..56c1af1 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 51de010..e8c44ad 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 b96f1bf..cae2de4 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 779209d..2a36d16 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;