Fix cexp (NaN + i0) (bug 15532).
authorJoseph Myers <joseph@codesourcery.com>
Fri, 23 Aug 2013 19:45:38 +0000 (19:45 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Fri, 23 Aug 2013 19:45:38 +0000 (19:45 +0000)
ChangeLog
NEWS
math/libm-test.inc
math/s_cexp.c
math/s_cexpf.c
math/s_cexpl.c

index ad2e4f1..42373ad 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2013-08-23  Joseph Myers  <joseph@codesourcery.com>
+
+       [BZ #15532]
+       * math/s_cexp.c (__cexp): Return NaN + i0 for NaN + i0 argument.
+       * math/s_cexpf.c (__cexpf): Likewise.
+       * math/s_cexpl.c (__cexpl): Likewise.
+       * math/libm-test.inc (cexp_test_data): Correct expected return
+       value for NaN + i0.  Add another test.
+
 2013-08-22  David S. Miller  <davem@davemloft.net>
 
        * po/ca.po: Update Catalan translation from translation project.
diff --git a/NEWS b/NEWS
index 0dc1c2d..8f204d5 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -9,7 +9,7 @@ Version 2.19
 
 * The following bugs are resolved with this release:
 
-  14699, 15531, 15749, 15797, 15867
+  14699, 15531, 15532, 15749, 15797, 15867
 
 * CVE-2013-4237 The readdir_r function could write more than NAME_MAX bytes
   to the d_name member of struct dirent, or omit the terminating NUL
index 43c4a8f..e534fc0 100644 (file)
@@ -6198,7 +6198,8 @@ static const struct test_c_c_data cexp_test_data[] =
 
     TEST_c_c (cexp, plus_infty, qnan_value, plus_infty, qnan_value),
 
-    TEST_c_c (cexp, qnan_value, 0.0, qnan_value, qnan_value, INVALID_EXCEPTION_OK),
+    TEST_c_c (cexp, qnan_value, 0.0, qnan_value, 0.0),
+    TEST_c_c (cexp, qnan_value, minus_zero, qnan_value, minus_zero),
     TEST_c_c (cexp, qnan_value, 1.0, qnan_value, qnan_value, INVALID_EXCEPTION_OK),
 
     TEST_c_c (cexp, qnan_value, plus_infty, qnan_value, qnan_value, INVALID_EXCEPTION_OK),
index 655e4e8..40e0e51 100644 (file)
@@ -145,12 +145,18 @@ __cexp (__complex__ double x)
     }
   else
     {
-      /* If the real part is NaN the result is NaN + iNaN.  */
+      /* If the real part is NaN the result is NaN + iNaN unless the
+        imaginary part is zero.  */
       __real__ retval = __nan ("");
-      __imag__ retval = __nan ("");
+      if (icls == FP_ZERO)
+       __imag__ retval = __imag__ x;
+      else
+       {
+         __imag__ retval = __nan ("");
 
-      if (rcls != FP_NAN || icls != FP_NAN)
-       feraiseexcept (FE_INVALID);
+         if (rcls != FP_NAN || icls != FP_NAN)
+           feraiseexcept (FE_INVALID);
+       }
     }
 
   return retval;
index fa942d3..7c42205 100644 (file)
@@ -145,12 +145,18 @@ __cexpf (__complex__ float x)
     }
   else
     {
-      /* If the real part is NaN the result is NaN + iNaN.  */
+      /* If the real part is NaN the result is NaN + iNaN unless the
+        imaginary part is zero.  */
       __real__ retval = __nanf ("");
-      __imag__ retval = __nanf ("");
+      if (icls == FP_ZERO)
+       __imag__ retval = __imag__ x;
+      else
+       {
+         __imag__ retval = __nanf ("");
 
-      if (rcls != FP_NAN || icls != FP_NAN)
-       feraiseexcept (FE_INVALID);
+         if (rcls != FP_NAN || icls != FP_NAN)
+           feraiseexcept (FE_INVALID);
+       }
     }
 
   return retval;
index d827bc3..0c35603 100644 (file)
@@ -145,12 +145,18 @@ __cexpl (__complex__ long double x)
     }
   else
     {
-      /* If the real part is NaN the result is NaN + iNaN.  */
+      /* If the real part is NaN the result is NaN + iNaN unless the
+        imaginary part is zero.  */
       __real__ retval = __nanl ("");
-      __imag__ retval = __nanl ("");
+      if (icls == FP_ZERO)
+       __imag__ retval = __imag__ x;
+      else
+       {
+         __imag__ retval = __nanl ("");
 
-      if (rcls != FP_NAN || icls != FP_NAN)
-       feraiseexcept (FE_INVALID);
+         if (rcls != FP_NAN || icls != FP_NAN)
+           feraiseexcept (FE_INVALID);
+       }
     }
 
   return retval;