Correct handling of special cases.
authordrepper <drepper>
Sat, 29 Mar 1997 16:50:07 +0000 (16:50 +0000)
committerdrepper <drepper>
Sat, 29 Mar 1997 16:50:07 +0000 (16:50 +0000)
sysdeps/libm-ieee754/s_cexpf.c
sysdeps/libm-ieee754/s_cexpl.c

index 261b18c..c5d8f0c 100644 (file)
@@ -33,8 +33,16 @@ __cexpf (__complex__ float x)
        {
          float exp_val = __expf (__real__ x);
 
-         __real__ retval = exp_val * __cosf (__imag__ x);
-         __imag__ retval = exp_val * __sinf (__imag__ x);
+         if (isfinite (exp_val))
+           {
+             __real__ retval = exp_val * __cosf (__imag__ x);
+             __imag__ retval = exp_val * __sinf (__imag__ x);
+           }
+         else
+           {
+             __real__ retval = __copysignf (exp_val, __cosf (__imag__ x));
+             __imag__ retval = __copysignf (exp_val, __sinf (__imag__ x));
+           }
        }
       else
        {
@@ -48,14 +56,17 @@ __cexpf (__complex__ float x)
     {
       if (isfinite (__imag__ x))
        {
-         if (signbit (__real__ x) == 0 && __imag__ x == 0.0)
-           retval = HUGE_VALF;
+         float value = signbit (__real__ x) ? 0.0 : HUGE_VALF;
+
+         if (__imag__ x == 0.0)
+           {
+             __real__ retval = value;
+             __imag__ retval = __imag__ x;
+           }
          else
            {
-             float value = signbit (__real__ x) ? 0.0 : HUGE_VALF;
-
-             __real__ retval = value * __cosf (__imag__ x);
-             __imag__ retval = value * __sinf (__imag__ x);
+             __real__ retval = __copysignf (value, __cosf (__imag__ x));
+             __imag__ retval = __copysignf (value, __sinf (__imag__ x));
            }
        }
       else if (signbit (__real__ x) == 0)
@@ -64,7 +75,10 @@ __cexpf (__complex__ float x)
          __imag__ retval = __nanf ("");
        }
       else
-       retval = 0.0;
+       {
+         __real__ retval = 0.0;
+         __imag__ retval = __copysignf (0.0, __imag__ x);
+       }
     }
   else
     {
index 779286f..f1cdf43 100644 (file)
@@ -33,8 +33,16 @@ __cexpl (__complex__ long double x)
        {
          long double exp_val = __expl (__real__ x);
 
-         __real__ retval = exp_val * __cosl (__imag__ x);
-         __imag__ retval = exp_val * __sinl (__imag__ x);
+         if (isfinite (exp_val))
+           {
+             __real__ retval = exp_val * __cosl (__imag__ x);
+             __imag__ retval = exp_val * __sinl (__imag__ x);
+           }
+         else
+           {
+             __real__ retval = __copysignl (exp_val, __cosl (__imag__ x));
+             __imag__ retval = __copysignl (exp_val, __sinl (__imag__ x));
+           }
        }
       else
        {
@@ -48,14 +56,17 @@ __cexpl (__complex__ long double x)
     {
       if (isfinite (__imag__ x))
        {
-         if (signbit (__real__ x) == 0 && __imag__ x == 0.0)
-           retval = HUGE_VAL;
+         long double value = signbit (__real__ x) ? 0.0 : HUGE_VALL;
+
+         if (__imag__ x == 0.0)
+           {
+             __real__ retval = value;
+             __imag__ retval = __imag__ x;
+           }
          else
            {
-             long double value = signbit (__real__ x) ? 0.0 : HUGE_VALL;
-
-             __real__ retval = value * __cosl (__imag__ x);
-             __imag__ retval = value * __sinl (__imag__ x);
+             __real__ retval = __copysignl (value, __cosl (__imag__ x));
+             __imag__ retval = __copysignl (value, __sinl (__imag__ x));
            }
        }
       else if (signbit (__real__ x) == 0)
@@ -64,7 +75,10 @@ __cexpl (__complex__ long double x)
          __imag__ retval = __nanl ("");
        }
       else
-       retval = 0.0;
+       {
+         __real__ retval = 0.0;
+         __imag__ retval = __copysignl (0.0, __imag__ x);
+       }
     }
   else
     {