]> sourceware.org Git - glibc.git/commitdiff
Fix dbl-64 atan2 (sNaN, qNaN) (bug 20252).
authorJoseph Myers <joseph@codesourcery.com>
Mon, 13 Jun 2016 21:43:22 +0000 (21:43 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Mon, 13 Jun 2016 21:43:22 +0000 (21:43 +0000)
The dbl-64 implementation of atan2, passed arguments (sNaN, qNaN),
fails to raise the "invalid" exception.  This patch fixes it to add
both arguments, rather than just adding the second argument to itself,
in the case where the second argument is a NaN (which is checked for
before checking for the first argument being a NaN).  sNaN tests for
atan2 are added, along with some qNaN tests I noticed were missing but
should have been there by analogy with other tests present.

Tested for x86_64 and x86.

[BZ #20252]
* sysdeps/ieee754/dbl-64/e_atan2.c (__ieee754_atan2): Add both
arguments when second argument is a NaN.
* math/libm-test.inc (atan2_test_data): Add sNaN tests and more
qNaN tests.

ChangeLog
math/libm-test.inc
sysdeps/ieee754/dbl-64/e_atan2.c

index d6b12ff91756068d149a9bb6679099f4c089d6dc..1d2c3e3d864b1480c9600b4a897255820bb5b41f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
 2016-06-13  Joseph Myers  <joseph@codesourcery.com>
 
+       [BZ #20252]
+       * sysdeps/ieee754/dbl-64/e_atan2.c (__ieee754_atan2): Add both
+       arguments when second argument is a NaN.
+       * math/libm-test.inc (atan2_test_data): Add sNaN tests and more
+       qNaN tests.
+
        * math/libm-test.inc (cimag_test_data): Add sNaN tests.
        (conj_test_data): Likewise.
        (copysign_test_data): Likewise.
index a8414ec9ca6b1e9310898e8b26e26c24b73ee12b..010743f98c6fb82419b6031d8111d05de6378dcc 100644 (file)
@@ -1986,6 +1986,18 @@ static const struct test_ff_f_data atan2_test_data[] =
     TEST_ff_f (atan2, qnan_value, -qnan_value, qnan_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
     TEST_ff_f (atan2, -qnan_value, qnan_value, qnan_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
     TEST_ff_f (atan2, -qnan_value, -qnan_value, qnan_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_ff_f (atan2, snan_value, qnan_value, qnan_value, INVALID_EXCEPTION),
+    TEST_ff_f (atan2, snan_value, -qnan_value, qnan_value, INVALID_EXCEPTION),
+    TEST_ff_f (atan2, -snan_value, qnan_value, qnan_value, INVALID_EXCEPTION),
+    TEST_ff_f (atan2, -snan_value, -qnan_value, qnan_value, INVALID_EXCEPTION),
+    TEST_ff_f (atan2, qnan_value, snan_value, qnan_value, INVALID_EXCEPTION),
+    TEST_ff_f (atan2, qnan_value, -snan_value, qnan_value, INVALID_EXCEPTION),
+    TEST_ff_f (atan2, -qnan_value, snan_value, qnan_value, INVALID_EXCEPTION),
+    TEST_ff_f (atan2, -qnan_value, -snan_value, qnan_value, INVALID_EXCEPTION),
+    TEST_ff_f (atan2, snan_value, snan_value, qnan_value, INVALID_EXCEPTION),
+    TEST_ff_f (atan2, snan_value, -snan_value, qnan_value, INVALID_EXCEPTION),
+    TEST_ff_f (atan2, -snan_value, snan_value, qnan_value, INVALID_EXCEPTION),
+    TEST_ff_f (atan2, -snan_value, -snan_value, qnan_value, INVALID_EXCEPTION),
     TEST_ff_f (atan2, qnan_value, plus_infty, qnan_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
     TEST_ff_f (atan2, qnan_value, minus_infty, qnan_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
     TEST_ff_f (atan2, qnan_value, plus_zero, qnan_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
@@ -2010,6 +2022,30 @@ static const struct test_ff_f_data atan2_test_data[] =
     TEST_ff_f (atan2, -qnan_value, -min_subnorm_value, qnan_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
     TEST_ff_f (atan2, -qnan_value, max_value, qnan_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
     TEST_ff_f (atan2, -qnan_value, -max_value, qnan_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_ff_f (atan2, snan_value, plus_infty, qnan_value, INVALID_EXCEPTION),
+    TEST_ff_f (atan2, snan_value, minus_infty, qnan_value, INVALID_EXCEPTION),
+    TEST_ff_f (atan2, snan_value, plus_zero, qnan_value, INVALID_EXCEPTION),
+    TEST_ff_f (atan2, snan_value, minus_zero, qnan_value, INVALID_EXCEPTION),
+    TEST_ff_f (atan2, snan_value, 1, qnan_value, INVALID_EXCEPTION),
+    TEST_ff_f (atan2, snan_value, -1, qnan_value, INVALID_EXCEPTION),
+    TEST_ff_f (atan2, snan_value, min_value, qnan_value, INVALID_EXCEPTION),
+    TEST_ff_f (atan2, snan_value, -min_value, qnan_value, INVALID_EXCEPTION),
+    TEST_ff_f (atan2, snan_value, min_subnorm_value, qnan_value, INVALID_EXCEPTION),
+    TEST_ff_f (atan2, snan_value, -min_subnorm_value, qnan_value, INVALID_EXCEPTION),
+    TEST_ff_f (atan2, snan_value, max_value, qnan_value, INVALID_EXCEPTION),
+    TEST_ff_f (atan2, snan_value, -max_value, qnan_value, INVALID_EXCEPTION),
+    TEST_ff_f (atan2, -snan_value, plus_infty, qnan_value, INVALID_EXCEPTION),
+    TEST_ff_f (atan2, -snan_value, minus_infty, qnan_value, INVALID_EXCEPTION),
+    TEST_ff_f (atan2, -snan_value, plus_zero, qnan_value, INVALID_EXCEPTION),
+    TEST_ff_f (atan2, -snan_value, minus_zero, qnan_value, INVALID_EXCEPTION),
+    TEST_ff_f (atan2, -snan_value, 1, qnan_value, INVALID_EXCEPTION),
+    TEST_ff_f (atan2, -snan_value, -1, qnan_value, INVALID_EXCEPTION),
+    TEST_ff_f (atan2, -snan_value, min_value, qnan_value, INVALID_EXCEPTION),
+    TEST_ff_f (atan2, -snan_value, -min_value, qnan_value, INVALID_EXCEPTION),
+    TEST_ff_f (atan2, -snan_value, min_subnorm_value, qnan_value, INVALID_EXCEPTION),
+    TEST_ff_f (atan2, -snan_value, -min_subnorm_value, qnan_value, INVALID_EXCEPTION),
+    TEST_ff_f (atan2, -snan_value, max_value, qnan_value, INVALID_EXCEPTION),
+    TEST_ff_f (atan2, -snan_value, -max_value, qnan_value, INVALID_EXCEPTION),
     TEST_ff_f (atan2, plus_infty, qnan_value, qnan_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
     TEST_ff_f (atan2, minus_infty, qnan_value, qnan_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
     TEST_ff_f (atan2, plus_zero, qnan_value, qnan_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
@@ -2022,6 +2058,8 @@ static const struct test_ff_f_data atan2_test_data[] =
     TEST_ff_f (atan2, -min_subnorm_value, qnan_value, qnan_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
     TEST_ff_f (atan2, max_value, qnan_value, qnan_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
     TEST_ff_f (atan2, -max_value, qnan_value, qnan_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_ff_f (atan2, plus_infty, -qnan_value, qnan_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_ff_f (atan2, minus_infty, -qnan_value, qnan_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
     TEST_ff_f (atan2, plus_zero, -qnan_value, qnan_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
     TEST_ff_f (atan2, minus_zero, -qnan_value, qnan_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
     TEST_ff_f (atan2, 1, -qnan_value, qnan_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
@@ -2032,6 +2070,30 @@ static const struct test_ff_f_data atan2_test_data[] =
     TEST_ff_f (atan2, -min_subnorm_value, -qnan_value, qnan_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
     TEST_ff_f (atan2, max_value, -qnan_value, qnan_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
     TEST_ff_f (atan2, -max_value, -qnan_value, qnan_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_ff_f (atan2, plus_infty, snan_value, qnan_value, INVALID_EXCEPTION),
+    TEST_ff_f (atan2, minus_infty, snan_value, qnan_value, INVALID_EXCEPTION),
+    TEST_ff_f (atan2, plus_zero, snan_value, qnan_value, INVALID_EXCEPTION),
+    TEST_ff_f (atan2, minus_zero, snan_value, qnan_value, INVALID_EXCEPTION),
+    TEST_ff_f (atan2, 1, snan_value, qnan_value, INVALID_EXCEPTION),
+    TEST_ff_f (atan2, -1, snan_value, qnan_value, INVALID_EXCEPTION),
+    TEST_ff_f (atan2, min_value, snan_value, qnan_value, INVALID_EXCEPTION),
+    TEST_ff_f (atan2, -min_value, snan_value, qnan_value, INVALID_EXCEPTION),
+    TEST_ff_f (atan2, min_subnorm_value, snan_value, qnan_value, INVALID_EXCEPTION),
+    TEST_ff_f (atan2, -min_subnorm_value, snan_value, qnan_value, INVALID_EXCEPTION),
+    TEST_ff_f (atan2, max_value, snan_value, qnan_value, INVALID_EXCEPTION),
+    TEST_ff_f (atan2, -max_value, snan_value, qnan_value, INVALID_EXCEPTION),
+    TEST_ff_f (atan2, plus_infty, -snan_value, qnan_value, INVALID_EXCEPTION),
+    TEST_ff_f (atan2, minus_infty, -snan_value, qnan_value, INVALID_EXCEPTION),
+    TEST_ff_f (atan2, plus_zero, -snan_value, qnan_value, INVALID_EXCEPTION),
+    TEST_ff_f (atan2, minus_zero, -snan_value, qnan_value, INVALID_EXCEPTION),
+    TEST_ff_f (atan2, 1, -snan_value, qnan_value, INVALID_EXCEPTION),
+    TEST_ff_f (atan2, -1, -snan_value, qnan_value, INVALID_EXCEPTION),
+    TEST_ff_f (atan2, min_value, -snan_value, qnan_value, INVALID_EXCEPTION),
+    TEST_ff_f (atan2, -min_value, -snan_value, qnan_value, INVALID_EXCEPTION),
+    TEST_ff_f (atan2, min_subnorm_value, -snan_value, qnan_value, INVALID_EXCEPTION),
+    TEST_ff_f (atan2, -min_subnorm_value, -snan_value, qnan_value, INVALID_EXCEPTION),
+    TEST_ff_f (atan2, max_value, -snan_value, qnan_value, INVALID_EXCEPTION),
+    TEST_ff_f (atan2, -max_value, -snan_value, qnan_value, INVALID_EXCEPTION),
 
     AUTO_TESTS_ff_f (atan2),
   };
index 22e8fb8fef5ec42495b9f05bafc808b20c2f8ba6..0838907019f63e4b30db5c68fac0cf09450d5a3d 100644 (file)
@@ -91,7 +91,7 @@ __ieee754_atan2 (double y, double x)
   if ((ux & 0x7ff00000) == 0x7ff00000)
     {
       if (((ux & 0x000fffff) | dx) != 0x00000000)
-       return x + x;
+       return x + y;
     }
   num.d = y;
   uy = num.i[HIGH_HALF];
This page took 0.230374 seconds and 5 git commands to generate.