Back to index

glibc  2.9
Functions
s_csqrtf.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__ float __csqrtf (__complex__ float x)

Function Documentation

__complex__ float __csqrtf ( __complex__ float  x)

Definition at line 29 of file s_csqrtf.c.

{
  __complex__ float 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_VALF;
         __imag__ res = __imag__ x;
       }
      else if (rcls == FP_INFINITE)
       {
         if (__real__ x < 0.0)
           {
             __real__ res = icls == FP_NAN ? __nanf ("") : 0;
             __imag__ res = __copysignf (HUGE_VALF, __imag__ x);
           }
         else
           {
             __real__ res = __real__ x;
             __imag__ res = (icls == FP_NAN
                           ? __nanf ("") : __copysignf (0.0, __imag__ x));
           }
       }
      else
       {
         __real__ res = __nanf ("");
         __imag__ res = __nanf ("");
       }
    }
  else
    {
      if (icls == FP_ZERO)
       {
         if (__real__ x < 0.0)
           {
             __real__ res = 0.0;
             __imag__ res = __copysignf (__ieee754_sqrtf (-__real__ x),
                                     __imag__ x);
           }
         else
           {
             __real__ res = fabsf (__ieee754_sqrtf (__real__ x));
             __imag__ res = __copysignf (0.0, __imag__ x);
           }
       }
      else if (rcls == FP_ZERO)
       {
         float r = __ieee754_sqrtf (0.5 * fabsf (__imag__ x));

         __real__ res = r;
         __imag__ res = __copysignf (r, __imag__ x);
       }
      else
       {
         float d, r, s;

         d = __ieee754_hypotf (__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_sqrtf (0.5f * d + 0.5f * __real__ x);
             s = (0.5f * __imag__ x) / r;
           }
         else
           {
             s = __ieee754_sqrtf (0.5f * d - 0.5f * __real__ x);
             r = fabsf ((0.5f * __imag__ x) / s);
           }

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

  return res;
}

Here is the call graph for this function:

Here is the caller graph for this function: