]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Fix wrong ussage of sincos for subnormal arguments
authorLiubov Dmitrieva <liubov.dmitrieva@gmail.com>
Tue, 25 Sep 2012 18:41:17 +0000 (20:41 +0200)
committerAndreas Jaeger <aj@suse.de>
Tue, 25 Sep 2012 18:41:17 +0000 (20:41 +0200)
19 files changed:
ChangeLog
math/s_ccosh.c
math/s_ccoshf.c
math/s_ccoshl.c
math/s_cexp.c
math/s_cexpf.c
math/s_cexpl.c
math/s_csin.c
math/s_csinf.c
math/s_csinh.c
math/s_csinhf.c
math/s_csinhl.c
math/s_csinl.c
math/s_ctan.c
math/s_ctanf.c
math/s_ctanh.c
math/s_ctanhf.c
math/s_ctanhl.c
math/s_ctanl.c

index cea98d16a6d2ae624c914820d6787c76112ecc6a..2a6e03835f83d804259c162d99b588d0971c754a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,25 @@
+2012-09-25  Liubov Dmitrieva  <liubov.dmitrieva@gmail.com>
+
+       * math/s_ccoshf.c (__ccoshf): Fix wrong using of sincosf for
+       subnormal argument.
+       * math/s_cexpf.c (__cexpf): Likewise.
+       * math/s_csinf.c (__csinf): Likewise.
+       * math/s_csinhf.c (__csinhf): Likewise.
+       * math/s_ctanf.c (__ctanf): Likewise.
+       * math/s_ctanhf.c (__ctanhf): Likewise.
+       * math/s_ccosh.c (__ccoshf): Likewise.
+       * math/s_cexp.c (__cexpl): Likewise.
+       * math/s_csin.c (__csin): Likewise.
+       * math/s_csinh.c (__csinh): Likewise.
+       * math/s_ctan.c (__ctan): Likewise.
+       * math/s_ctanh.c (ctanh): Likewise.
+       * math/s_ccoshl.c (__ccoshl): Likewise.
+       * math/s_cexpl.c (__cexpl): Likewise.
+       * math/s_csinl.c (__csinl): Likewise.
+       * math/s_csinhl.c (__csinhl): Likewise.
+       * math/s_ctanl.c (__ctanl): Likewise.
+       * math/s_ctanhl.c (__ctanhl): Likewise.
+
 2012-09-25  Joseph Myers  <joseph@codesourcery.com>
 
        * libio/libio.h (_IO_size_t): Define to size_t, not _G_size_t.
index 44c9944466f7588ec18c4e911c0956d7ebe135f1..91477ee2d0e8668032304d5f607f305b4f212324 100644 (file)
@@ -39,7 +39,15 @@ __ccosh (__complex__ double x)
          const int t = (int) ((DBL_MAX_EXP - 1) * M_LN2);
          double sinix, cosix;
 
-         __sincos (__imag__ x, &sinix, &cosix);
+         if (__builtin_expect (icls != FP_SUBNORMAL, 1))
+           {
+             __sincos (__imag__ x, &sinix, &cosix);
+           }
+         else
+           {
+             sinix = __imag__ x;
+             cosix = 1.0;
+           }
 
          if (fabs (__real__ x) > t)
            {
@@ -92,7 +100,15 @@ __ccosh (__complex__ double x)
          /* Imaginary part is finite.  */
          double sinix, cosix;
 
-         __sincos (__imag__ x, &sinix, &cosix);
+         if (__builtin_expect (icls != FP_SUBNORMAL, 1))
+           {
+             __sincos (__imag__ x, &sinix, &cosix);
+           }
+         else
+           {
+             sinix = __imag__ x;
+             cosix = 1.0;
+           }
 
          __real__ retval = __copysign (HUGE_VAL, cosix);
          __imag__ retval = (__copysign (HUGE_VAL, sinix)
index d6f811049ebb3c84b1289d1274eb6c38d3e2609d..9ca57b25b985188a7717db8242fd0f46bdac5de7 100644 (file)
@@ -39,7 +39,15 @@ __ccoshf (__complex__ float x)
          const int t = (int) ((FLT_MAX_EXP - 1) * M_LN2);
          float sinix, cosix;
 
-         __sincosf (__imag__ x, &sinix, &cosix);
+         if (__builtin_expect (icls != FP_SUBNORMAL, 1))
+           {
+             __sincosf (__imag__ x, &sinix, &cosix);
+           }
+         else
+           {
+             sinix = __imag__ x;
+             cosix = 1.0f;
+           }
 
          if (fabsf (__real__ x) > t)
            {
@@ -92,7 +100,15 @@ __ccoshf (__complex__ float x)
          /* Imaginary part is finite.  */
          float sinix, cosix;
 
-         __sincosf (__imag__ x, &sinix, &cosix);
+         if (__builtin_expect (icls != FP_SUBNORMAL, 1))
+           {
+             __sincosf (__imag__ x, &sinix, &cosix);
+           }
+         else
+           {
+             sinix = __imag__ x;
+             cosix = 1.0f;
+           }
 
          __real__ retval = __copysignf (HUGE_VALF, cosix);
          __imag__ retval = (__copysignf (HUGE_VALF, sinix)
index 77a9ae386983db392c9f42126a4a45d71da82de5..1d561b4e3fcfaa862a772943b5f7c23bf95cc95f 100644 (file)
@@ -39,7 +39,15 @@ __ccoshl (__complex__ long double x)
          const int t = (int) ((LDBL_MAX_EXP - 1) * M_LN2l);
          long double sinix, cosix;
 
-         __sincosl (__imag__ x, &sinix, &cosix);
+         if (__builtin_expect (icls != FP_SUBNORMAL, 1))
+           {
+             __sincosl (__imag__ x, &sinix, &cosix);
+           }
+         else
+           {
+             sinix = __imag__ x;
+             cosix = 1.0;
+           }
 
          if (fabsl (__real__ x) > t)
            {
@@ -92,7 +100,15 @@ __ccoshl (__complex__ long double x)
          /* Imaginary part is finite.  */
          long double sinix, cosix;
 
-         __sincosl (__imag__ x, &sinix, &cosix);
+         if (__builtin_expect (icls != FP_SUBNORMAL, 1))
+           {
+             __sincosl (__imag__ x, &sinix, &cosix);
+           }
+         else
+           {
+             sinix = __imag__ x;
+             cosix = 1.0;
+           }
 
          __real__ retval = __copysignl (HUGE_VALL, cosix);
          __imag__ retval = (__copysignl (HUGE_VALL, sinix)
index 1d7a5a2c408b6f3a98385eae8a61cdf704dc1fd2..d0a95ba79c476ee9bf3ef895867534953da98802 100644 (file)
@@ -39,7 +39,15 @@ __cexp (__complex__ double x)
          const int t = (int) ((DBL_MAX_EXP - 1) * M_LN2);
          double sinix, cosix;
 
-         __sincos (__imag__ x, &sinix, &cosix);
+         if (__builtin_expect (icls != FP_SUBNORMAL, 1))
+           {
+             __sincos (__imag__ x, &sinix, &cosix);
+           }
+         else
+           {
+             sinix = __imag__ x;
+             cosix = 1.0;
+           }
 
          if (__real__ x > t)
            {
@@ -95,7 +103,15 @@ __cexp (__complex__ double x)
            {
              double sinix, cosix;
 
-             __sincos (__imag__ x, &sinix, &cosix);
+             if (__builtin_expect (icls != FP_SUBNORMAL, 1))
+               {
+                 __sincos (__imag__ x, &sinix, &cosix);
+               }
+             else
+               {
+                 sinix = __imag__ x;
+                 cosix = 1.0;
+               }
 
              __real__ retval = __copysign (value, cosix);
              __imag__ retval = __copysign (value, sinix);
index 4aa976581809250fcd3226ea428794dd65aa46b4..41fcea51dba46f5f77f7ea5728378b707db0ed6e 100644 (file)
@@ -39,7 +39,15 @@ __cexpf (__complex__ float x)
          const int t = (int) ((FLT_MAX_EXP - 1) * M_LN2);
          float sinix, cosix;
 
-         __sincosf (__imag__ x, &sinix, &cosix);
+         if (__builtin_expect (icls != FP_SUBNORMAL, 1))
+           {
+             __sincosf (__imag__ x, &sinix, &cosix);
+           }
+         else
+           {
+             sinix = __imag__ x;
+             cosix = 1.0f;
+           }
 
          if (__real__ x > t)
            {
@@ -95,7 +103,15 @@ __cexpf (__complex__ float x)
            {
              float sinix, cosix;
 
-             __sincosf (__imag__ x, &sinix, &cosix);
+             if (__builtin_expect (icls != FP_SUBNORMAL, 1))
+               {
+                 __sincosf (__imag__ x, &sinix, &cosix);
+               }
+             else
+               {
+                 sinix = __imag__ x;
+                 cosix = 1.0f;
+               }
 
              __real__ retval = __copysignf (value, cosix);
              __imag__ retval = __copysignf (value, sinix);
index 256824924f93417869b0d41ab978fb9cfdf442be..d67cc5e5eb7133f7ae0a6db5710e4c0b064e123d 100644 (file)
@@ -39,7 +39,15 @@ __cexpl (__complex__ long double x)
          const int t = (int) ((LDBL_MAX_EXP - 1) * M_LN2l);
          long double sinix, cosix;
 
-         __sincosl (__imag__ x, &sinix, &cosix);
+         if (__builtin_expect (icls != FP_SUBNORMAL, 1))
+           {
+             __sincosl (__imag__ x, &sinix, &cosix);
+           }
+         else
+           {
+             sinix = __imag__ x;
+             cosix = 1.0;
+           }
 
          if (__real__ x > t)
            {
@@ -95,7 +103,15 @@ __cexpl (__complex__ long double x)
            {
              long double sinix, cosix;
 
-             __sincosl (__imag__ x, &sinix, &cosix);
+             if (__builtin_expect (icls != FP_SUBNORMAL, 1))
+               {
+                 __sincosl (__imag__ x, &sinix, &cosix);
+               }
+             else
+               {
+                 sinix = __imag__ x;
+                 cosix = 1.0;
+               }
 
              __real__ retval = __copysignl (value, cosix);
              __imag__ retval = __copysignl (value, sinix);
index 602c14e5371c12819466d8df8a3b3f64d8f29454..725989c9c7f05be196088422dd72e3c0368877b9 100644 (file)
@@ -42,7 +42,15 @@ __csin (__complex__ double x)
          const int t = (int) ((DBL_MAX_EXP - 1) * M_LN2);
          double sinix, cosix;
 
-         __sincos (__real__ x, &sinix, &cosix);
+         if (__builtin_expect (rcls != FP_SUBNORMAL, 1))
+           {
+             __sincos (__real__ x, &sinix, &cosix);
+           }
+         else
+           {
+             sinix = __real__ x;
+             cosix = 1.0;
+           }
 
          if (fabs (__imag__ x) > t)
            {
@@ -115,7 +123,15 @@ __csin (__complex__ double x)
          /* Real part is finite.  */
          double sinix, cosix;
 
-         __sincos (__real__ x, &sinix, &cosix);
+         if (__builtin_expect (rcls != FP_SUBNORMAL, 1))
+           {
+             __sincos (__real__ x, &sinix, &cosix);
+           }
+         else
+           {
+             sinix = __real__ x;
+             cosix = 1.0;
+           }
 
          __real__ retval = __copysign (HUGE_VAL, sinix);
          __imag__ retval = __copysign (HUGE_VAL, cosix);
index c1d6a4f28e0be0e3a12e04eeeae371d50722930f..d53f943fa71057a133c09eebff528b65decf08b5 100644 (file)
@@ -42,7 +42,15 @@ __csinf (__complex__ float x)
          const int t = (int) ((FLT_MAX_EXP - 1) * M_LN2);
          float sinix, cosix;
 
-         __sincosf (__real__ x, &sinix, &cosix);
+         if (__builtin_expect (rcls != FP_SUBNORMAL, 1))
+           {
+             __sincosf (__real__ x, &sinix, &cosix);
+           }
+         else
+           {
+             sinix = __real__ x;
+             cosix = 1.0f;
+           }
 
          if (fabsf (__imag__ x) > t)
            {
@@ -115,7 +123,15 @@ __csinf (__complex__ float x)
          /* Real part is finite.  */
          float sinix, cosix;
 
-         __sincosf (__real__ x, &sinix, &cosix);
+         if (__builtin_expect (rcls != FP_SUBNORMAL, 1))
+           {
+             __sincosf (__real__ x, &sinix, &cosix);
+           }
+         else
+           {
+             sinix = __real__ x;
+             cosix = 1.0f;
+           }
 
          __real__ retval = __copysignf (HUGE_VALF, sinix);
          __imag__ retval = __copysignf (HUGE_VALF, cosix);
index 56bb2562391fde3c3cf921a3f5fb5926d074e1cb..20edbd13f00cccb832ff8363ff46816077f9f184 100644 (file)
@@ -42,7 +42,15 @@ __csinh (__complex__ double x)
          const int t = (int) ((DBL_MAX_EXP - 1) * M_LN2);
          double sinix, cosix;
 
-         __sincos (__imag__ x, &sinix, &cosix);
+         if (__builtin_expect (icls != FP_SUBNORMAL, 1))
+           {
+             __sincos (__imag__ x, &sinix, &cosix);
+           }
+         else
+           {
+             sinix = __imag__ x;
+             cosix = 1.0;
+           }
 
          if (fabs (__real__ x) > t)
            {
@@ -109,7 +117,15 @@ __csinh (__complex__ double x)
          /* Imaginary part is finite.  */
          double sinix, cosix;
 
-         __sincos (__imag__ x, &sinix, &cosix);
+         if (__builtin_expect (icls != FP_SUBNORMAL, 1))
+           {
+             __sincos (__imag__ x, &sinix, &cosix);
+           }
+         else
+           {
+             sinix = __imag__ x;
+             cosix = 1.0;
+           }
 
          __real__ retval = __copysign (HUGE_VAL, cosix);
          __imag__ retval = __copysign (HUGE_VAL, sinix);
index ba85e79b8a4dd51ad45cd7f5e330d1bab79c7af8..4b019a0ed886e9a74a45b867114c372772f72d3f 100644 (file)
@@ -42,7 +42,15 @@ __csinhf (__complex__ float x)
          const int t = (int) ((FLT_MAX_EXP - 1) * M_LN2);
          float sinix, cosix;
 
-         __sincosf (__imag__ x, &sinix, &cosix);
+         if (__builtin_expect (icls != FP_SUBNORMAL, 1))
+           {
+             __sincosf (__imag__ x, &sinix, &cosix);
+           }
+         else
+           {
+             sinix = __imag__ x;
+             cosix = 1.0f;
+           }
 
          if (fabsf (__real__ x) > t)
            {
@@ -109,7 +117,15 @@ __csinhf (__complex__ float x)
          /* Imaginary part is finite.  */
          float sinix, cosix;
 
-         __sincosf (__imag__ x, &sinix, &cosix);
+         if (__builtin_expect (icls != FP_SUBNORMAL, 1))
+           {
+             __sincosf (__imag__ x, &sinix, &cosix);
+           }
+         else
+           {
+             sinix = __imag__ x;
+             cosix = 1.0f;
+           }
 
          __real__ retval = __copysignf (HUGE_VALF, cosix);
          __imag__ retval = __copysignf (HUGE_VALF, sinix);
index e482e3a62e80cdfc3be83ba2de299232057fab03..d9a928a40187dfdc2dc77e79c3b5b80dc8eecf4b 100644 (file)
@@ -42,7 +42,15 @@ __csinhl (__complex__ long double x)
          const int t = (int) ((LDBL_MAX_EXP - 1) * M_LN2l);
          long double sinix, cosix;
 
-         __sincosl (__imag__ x, &sinix, &cosix);
+         if (__builtin_expect (icls != FP_SUBNORMAL, 1))
+           {
+             __sincosl (__imag__ x, &sinix, &cosix);
+           }
+         else
+           {
+             sinix = __imag__ x;
+             cosix = 1.0;
+           }
 
          if (fabsl (__real__ x) > t)
            {
@@ -109,7 +117,15 @@ __csinhl (__complex__ long double x)
          /* Imaginary part is finite.  */
          long double sinix, cosix;
 
-         __sincosl (__imag__ x, &sinix, &cosix);
+         if (__builtin_expect (icls != FP_SUBNORMAL, 1))
+           {
+             __sincosl (__imag__ x, &sinix, &cosix);
+           }
+         else
+           {
+             sinix = __imag__ x;
+             cosix = 1.0;
+           }
 
          __real__ retval = __copysignl (HUGE_VALL, cosix);
          __imag__ retval = __copysignl (HUGE_VALL, sinix);
index ff43256e54cb643a695315a5d31b8d70a3d8a70c..9812bddd5c1593d513e8d70048af53d7bbdae745 100644 (file)
@@ -42,7 +42,15 @@ __csinl (__complex__ long double x)
          const int t = (int) ((LDBL_MAX_EXP - 1) * M_LN2l);
          long double sinix, cosix;
 
-         __sincosl (__real__ x, &sinix, &cosix);
+         if (__builtin_expect (rcls != FP_SUBNORMAL, 1))
+           {
+             __sincosl (__real__ x, &sinix, &cosix);
+           }
+         else
+           {
+             sinix = __real__ x;
+             cosix = 1.0;
+           }
 
          if (fabsl (__imag__ x) > t)
            {
@@ -115,7 +123,15 @@ __csinl (__complex__ long double x)
          /* Real part is finite.  */
          long double sinix, cosix;
 
-         __sincosl (__real__ x, &sinix, &cosix);
+         if (__builtin_expect (rcls != FP_SUBNORMAL, 1))
+           {
+             __sincosl (__real__ x, &sinix, &cosix);
+           }
+         else
+           {
+             sinix = __real__ x;
+             cosix = 1.0;
+           }
 
          __real__ retval = __copysignl (HUGE_VALL, sinix);
          __imag__ retval = __copysignl (HUGE_VALL, cosix);
index 89c0fef91e5a6278ba7521dc87f4e1beebbf3795..fdba847447347eaae78c26e7e142eaa432240932 100644 (file)
@@ -53,11 +53,20 @@ __ctan (__complex__ double x)
       double sinrx, cosrx;
       double den;
       const int t = (int) ((DBL_MAX_EXP - 1) * M_LN2 / 2);
+      int rcls = fpclassify (__real__ x);
 
       /* tan(x+iy) = (sin(2x) + i*sinh(2y))/(cos(2x) + cosh(2y))
         = (sin(x)*cos(x) + i*sinh(y)*cosh(y)/(cos(x)^2 + sinh(y)^2). */
 
-      __sincos (__real__ x, &sinrx, &cosrx);
+      if (__builtin_expect (rcls != FP_SUBNORMAL, 1))
+       {
+         __sincos (__real__ x, &sinrx, &cosrx);
+       }
+      else
+       {
+         sinrx = __real__ x;
+         cosrx = 1.0;
+       }
 
       if (fabs (__imag__ x) > t)
        {
index 2559f83f84c4c520ab7f323fa568e4ca9b93eaf9..fd2b79788233d4bdf48ad42b1d7885ca69879ccf 100644 (file)
@@ -57,7 +57,15 @@ __ctanf (__complex__ float x)
       /* tan(x+iy) = (sin(2x) + i*sinh(2y))/(cos(2x) + cosh(2y))
         = (sin(x)*cos(x) + i*sinh(y)*cosh(y)/(cos(x)^2 + sinh(y)^2). */
 
-      __sincosf (__real__ x, &sinrx, &cosrx);
+      if (__builtin_expect (fpclassify(__real__ x) != FP_SUBNORMAL, 1))
+       {
+         __sincosf (__real__ x, &sinrx, &cosrx);
+       }
+      else
+       {
+         sinrx = __real__ x;
+         cosrx = 1.0f;
+       }
 
       if (fabsf (__imag__ x) > t)
        {
index d288b7d168f24818683b70747a31f7811d8703f6..fee19105512eeddfe284a7a5e9dadf0d56475578 100644 (file)
@@ -53,11 +53,20 @@ __ctanh (__complex__ double x)
       double sinix, cosix;
       double den;
       const int t = (int) ((DBL_MAX_EXP - 1) * M_LN2 / 2);
+      int icls = fpclassify (__imag__ x);
 
       /* tanh(x+iy) = (sinh(2x) + i*sin(2y))/(cosh(2x) + cos(2y))
         = (sinh(x)*cosh(x) + i*sin(y)*cos(y))/(sinh(x)^2 + cos(y)^2).  */
 
-      __sincos (__imag__ x, &sinix, &cosix);
+      if (__builtin_expect (icls != FP_SUBNORMAL, 1))
+       {
+         __sincos (__imag__ x, &sinix, &cosix);
+       }
+      else
+       {
+         sinix = __imag__ x;
+         cosix = 1.0;
+       }
 
       if (fabs (__real__ x) > t)
        {
index ca36a83bfbf11fe1359694928c094bd714ef6786..862845f8c2e57e70687dc8ff59e91c00bc1a2654 100644 (file)
@@ -57,7 +57,15 @@ __ctanhf (__complex__ float x)
       /* tanh(x+iy) = (sinh(2x) + i*sin(2y))/(cosh(2x) + cos(2y))
         = (sinh(x)*cosh(x) + i*sin(y)*cos(y))/(sinh(x)^2 + cos(y)^2).  */
 
-      __sincosf (__imag__ x, &sinix, &cosix);
+      if (__builtin_expect (fpclassify(__imag__ x) != FP_SUBNORMAL, 1))
+       {
+         __sincosf (__imag__ x, &sinix, &cosix);
+       }
+      else
+       {
+         sinix = __imag__ x;
+         cosix = 1.0f;
+       }
 
       if (fabsf (__real__ x) > t)
        {
index dbf1612707208500233e821280f60b43bc99ce3b..c4fc1d3d04829abe16d4068eb54b99dbb818f7ca 100644 (file)
@@ -53,11 +53,20 @@ __ctanhl (__complex__ long double x)
       long double sinix, cosix;
       long double den;
       const int t = (int) ((LDBL_MAX_EXP - 1) * M_LN2l / 2);
+      int icls = fpclassify (__imag__ x);
 
       /* tanh(x+iy) = (sinh(2x) + i*sin(2y))/(cosh(2x) + cos(2y))
         = (sinh(x)*cosh(x) + i*sin(y)*cos(y))/(sinh(x)^2 + cos(y)^2).  */
 
-      __sincosl (__imag__ x, &sinix, &cosix);
+      if (__builtin_expect (icls != FP_SUBNORMAL, 1))
+       {
+         __sincosl (__imag__ x, &sinix, &cosix);
+       }
+      else
+       {
+         sinix = __imag__ x;
+         cosix = 1.0;
+       }
 
       if (fabsl (__real__ x) > t)
        {
index 4fe26119c8fceb3cd90a56bc6f48319d29030ead..0affe932112bf1a5e372f745f35fe7e27e1afbed 100644 (file)
@@ -53,11 +53,20 @@ __ctanl (__complex__ long double x)
       long double sinrx, cosrx;
       long double den;
       const int t = (int) ((LDBL_MAX_EXP - 1) * M_LN2l / 2);
+      int rcls = fpclassify (__real__ x);
 
       /* tan(x+iy) = (sin(2x) + i*sinh(2y))/(cos(2x) + cosh(2y))
         = (sin(x)*cos(x) + i*sinh(y)*cosh(y)/(cos(x)^2 + sinh(y)^2). */
 
-      __sincosl (__real__ x, &sinrx, &cosrx);
+      if (__builtin_expect (rcls != FP_SUBNORMAL, 1))
+       {
+         __sincosl (__real__ x, &sinrx, &cosrx);
+       }
+      else
+       {
+         sinrx = __real__ x;
+         cosrx = 1.0;
+       }
 
       if (fabsl (__imag__ x) > t)
        {