Back to index

glibc  2.9
Functions
s_csqrtl.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__ long double __csqrtl (__complex__ long double x)

Function Documentation

__complex__ long double __csqrtl ( __complex__ long double  x)

Definition at line 29 of file s_csqrtl.c.

{
  __complex__ long 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_VALL;
         __imag__ res = __imag__ x;
       }
      else if (rcls == FP_INFINITE)
       {
         if (__real__ x < 0.0)
           {
             __real__ res = icls == FP_NAN ? __nanl ("") : 0;
             __imag__ res = __copysignl (HUGE_VALL, __imag__ x);
           }
         else
           {
             __real__ res = __real__ x;
             __imag__ res = (icls == FP_NAN
                           ? __nanl ("") : __copysignl (0.0, __imag__ x));
           }
       }
      else
       {
         __real__ res = __nanl ("");
         __imag__ res = __nanl ("");
       }
    }
  else
    {
      if (icls == FP_ZERO)
       {
         if (__real__ x < 0.0)
           {
             __real__ res = 0.0;
             __imag__ res = __copysignl (__ieee754_sqrtl (-__real__ x),
                                     __imag__ x);
           }
         else
           {
             __real__ res = fabsl (__ieee754_sqrtl (__real__ x));
             __imag__ res = __copysignl (0.0, __imag__ x);
           }
       }
      else if (rcls == FP_ZERO)
       {
         long double r = __ieee754_sqrtl (0.5 * fabsl (__imag__ x));

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

         d = __ieee754_hypotl (__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_sqrtl (0.5L * d + 0.5L * __real__ x);
             s = (0.5L * __imag__ x) / r;
           }
         else
           {
             s = __ieee754_sqrtl (0.5L * d - 0.5L * __real__ x);
             r = fabsl ((0.5L * __imag__ x) / s);
           }

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

  return res;
}

Here is the call graph for this function:

Here is the caller graph for this function: