Back to index

glibc  2.9
Functions
s_csqrt.c File Reference
#include <complex.h>
#include <math.h>
#include "math_private.h"
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Functions

__complex__ double __csqrt (__complex__ double x)

Function Documentation

__complex__ double __csqrt ( __complex__ double  x)

Definition at line 29 of file s_csqrt.c.

{
  __complex__ double res;
  int rcls = fpclassify (__real__ x);
  int icls = fpclassify (__imag__ x);

  if (rcls <= FP_INFINITE || icls <= FP_INFINITE)
    {
      if (icls == FP_INFINITE)
       {
         __real__ res = HUGE_VAL;
         __imag__ res = __imag__ x;
       }
      else if (rcls == FP_INFINITE)
       {
         if (__real__ x < 0.0)
           {
             __real__ res = icls == FP_NAN ? __nan ("") : 0;
             __imag__ res = __copysign (HUGE_VAL, __imag__ x);
           }
         else
           {
             __real__ res = __real__ x;
             __imag__ res = (icls == FP_NAN
                           ? __nan ("") : __copysign (0.0, __imag__ x));
           }
       }
      else
       {
         __real__ res = __nan ("");
         __imag__ res = __nan ("");
       }
    }
  else
    {
      if (icls == FP_ZERO)
       {
         if (__real__ x < 0.0)
           {
             __real__ res = 0.0;
             __imag__ res = __copysign (__ieee754_sqrt (-__real__ x),
                                    __imag__ x);
           }
         else
           {
             __real__ res = fabs (__ieee754_sqrt (__real__ x));
             __imag__ res = __copysign (0.0, __imag__ x);
           }
       }
      else if (rcls == FP_ZERO)
       {
         double r = __ieee754_sqrt (0.5 * fabs (__imag__ x));

         __real__ res = r;
         __imag__ res = __copysign (r, __imag__ x);
       }
      else
       {
         double d, r, s;

         d = __ieee754_hypot (__real__ x, __imag__ x);
         /* Use the identity   2  Re res  Im res = Im x
            to avoid cancellation error in  d +/- Re x.  */
         if (__real__ x > 0)
           {
             r = __ieee754_sqrt (0.5 * d + 0.5 * __real__ x);
             s = (0.5 * __imag__ x) / r;
           }
         else
           {
             s = __ieee754_sqrt (0.5 * d - 0.5 * __real__ x);
             r = fabs ((0.5 * __imag__ x) / s);
           }

         __real__ res = r;
         __imag__ res = __copysign (s, __imag__ x);
       }
    }

  return res;
}

Here is the call graph for this function:

Here is the caller graph for this function: