Fix missing underflow from cexp (bug 14478).
authorJoseph Myers <joseph@codesourcery.com>
Wed, 3 Apr 2013 16:51:46 +0000 (16:51 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Wed, 3 Apr 2013 16:51:46 +0000 (16:51 +0000)
ChangeLog
NEWS
math/libm-test.inc
math/s_cexp.c
math/s_cexpf.c
math/s_cexpl.c

index deebea4..8d2602b 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2013-04-03  Joseph Myers  <joseph@codesourcery.com>
+
+       [BZ #14478]
+       * math/s_cexp.c (__cexp): Ensure underflow exception occurs for
+       underflowed result.
+       * math/s_cexpf.c (__cexpf): Likewise.
+       * math/s_cexpl.c (__cexpl): Likewise.
+       * math/libm-test.inc (cexp_test): Add more tests.
+
 2013-04-03  Andreas Schwab  <schwab@suse.de>
 
        [BZ #15330]
diff --git a/NEWS b/NEWS
index 513c185..e28b287 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -10,10 +10,10 @@ Version 2.18
 * The following bugs are resolved with this release:
 
   10357, 11120, 11561, 12723, 13550, 13889, 13951, 14142, 14176, 14200,
-  14317, 14327, 14496, 14812, 14920, 14964, 14981, 14982, 14985, 14994,
-  14996, 15003, 15006, 15020, 15023, 15036, 15054, 15055, 15062, 15078,
-  15160, 15214, 15232, 15234, 15283, 15285, 15287, 15304, 15305, 15307,
-  15327, 15330.
+  14317, 14327, 14478, 14496, 14812, 14920, 14964, 14981, 14982, 14985,
+  14994, 14996, 15003, 15006, 15020, 15023, 15036, 15054, 15055, 15062,
+  15078, 15160, 15214, 15232, 15234, 15283, 15285, 15287, 15304, 15305,
+  15307, 15327, 15330.
 
 * CVE-2013-0242 Buffer overrun in regexp matcher has been fixed (Bugzilla
   #15078).
index c9ed719..08c80fa 100644 (file)
@@ -4794,6 +4794,9 @@ cexp_test (void)
   TEST_c_c (cexp, 1e6, min_value, plus_infty, plus_infty, OVERFLOW_EXCEPTION);
   TEST_c_c (cexp, 1e6, -min_value, plus_infty, minus_infty, OVERFLOW_EXCEPTION);
 
+  TEST_c_c (cexp, min_value, min_subnorm_value, 1.0, min_subnorm_value, UNDERFLOW_EXCEPTION);
+  TEST_c_c (cexp, min_value, -min_subnorm_value, 1.0, -min_subnorm_value, UNDERFLOW_EXCEPTION);
+
   END (cexp, complex);
 }
 
index 36157ff..655e4e8 100644 (file)
@@ -74,6 +74,18 @@ __cexp (__complex__ double x)
              __real__ retval = exp_val * cosix;
              __imag__ retval = exp_val * sinix;
            }
+         if (fabs (__real__ retval) < DBL_MIN)
+           {
+             volatile double force_underflow
+               = __real__ retval * __real__ retval;
+             (void) force_underflow;
+           }
+         if (fabs (__imag__ retval) < DBL_MIN)
+           {
+             volatile double force_underflow
+               = __imag__ retval * __imag__ retval;
+             (void) force_underflow;
+           }
        }
       else
        {
index 364be8a..fa942d3 100644 (file)
@@ -74,6 +74,18 @@ __cexpf (__complex__ float x)
              __real__ retval = exp_val * cosix;
              __imag__ retval = exp_val * sinix;
            }
+         if (fabsf (__real__ retval) < FLT_MIN)
+           {
+             volatile float force_underflow
+               = __real__ retval * __real__ retval;
+             (void) force_underflow;
+           }
+         if (fabsf (__imag__ retval) < FLT_MIN)
+           {
+             volatile float force_underflow
+               = __imag__ retval * __imag__ retval;
+             (void) force_underflow;
+           }
        }
       else
        {
index 1bfce78..d827bc3 100644 (file)
@@ -74,6 +74,18 @@ __cexpl (__complex__ long double x)
              __real__ retval = exp_val * cosix;
              __imag__ retval = exp_val * sinix;
            }
+         if (fabsl (__real__ retval) < LDBL_MIN)
+           {
+             volatile long double force_underflow
+               = __real__ retval * __real__ retval;
+             (void) force_underflow;
+           }
+         if (fabsl (__imag__ retval) < LDBL_MIN)
+           {
+             volatile long double force_underflow
+               = __imag__ retval * __imag__ retval;
+             (void) force_underflow;
+           }
        }
       else
        {