diff options
Diffstat (limited to 'winsup/mingw/mingwex/complex/csqrt.c')
-rw-r--r-- | winsup/mingw/mingwex/complex/csqrt.c | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/winsup/mingw/mingwex/complex/csqrt.c b/winsup/mingw/mingwex/complex/csqrt.c new file mode 100644 index 000000000..3717939f4 --- /dev/null +++ b/winsup/mingw/mingwex/complex/csqrt.c @@ -0,0 +1,55 @@ +/* + csqrt.c + Contributed by Danny Smith + 2003-10-20 +*/ + +#include <math.h> +#include <complex.h> + +double complex csqrt (double complex Z) +{ + double complex Res; + double t; + double x = __real__ Z; + double y = __imag__ Z; + + if (y == 0.0) + { + if (x < 0.0) + { + __real__ Res = 0.0; + __imag__ Res = sqrt (-x); + } + else + { + __real__ Res = sqrt (x); + __imag__ Res = 0.0; + } + } + + else if (x == 0.0) + { + t = sqrt(0.5 * fabs (y)); + __real__ Res = y > 0 ? t : -t; + __imag__ Res = t; + } + + else + { + t = sqrt (2.0 * (_hypot (x, y) + fabs (x))); + if ( x > 0.0) + { + __real__ Res = 0.5 * t; + __imag__ Res = y / t; + } + else + { + __real__ Res = fabs ( y / t); + __imag__ Res = (y < 0.0 ? -0.5 : 0.5) * t; + } + } + + return Res; +} + |