diff options
author | Danny Smith <dannysmith@users.sourceforge.net> | 2003-10-21 13:43:22 +0400 |
---|---|---|
committer | Danny Smith <dannysmith@users.sourceforge.net> | 2003-10-21 13:43:22 +0400 |
commit | 3c7a7a5fcaaf92fc6762a23089738853973044d9 (patch) | |
tree | 4451bd7cfebc3022b0f780a5f0c40bd60db140c4 /winsup/mingw/mingwex/complex/cpow.c | |
parent | 6de52354ebdfb6badf96e7825a09d832512e839d (diff) |
Add ISO C99 complex support for doubles.
* include/complex.h: New file.
* mingwex/complex: New directory.
* mingwex/complex/cabs.c: New file.
* mingwex/complex/cacos.c: New file.
* mingwex/complex/cacosh.c: New file.
* mingwex/complex/casin.c: New file.
* mingwex/complex/casinh.c: New file.
* mingwex/complex/catan.c: New file.
* mingwex/complex/catanh.c: New file.
* mingwex/complex/ccos.c: New file.
* mingwex/complex/ccosh.c: New file.
* mingwex/complex/cexp.c: New file.
* mingwex/complex/cimag.c: New file.
* mingwex/complex/clog.c: New file.
* mingwex/complex/cpow.c: New file.
* mingwex/complex/cproj.c: New file.
* mingwex/complex/creal.c: New file.
* mingwex/complex/csin.c: New file.
* mingwex/complex/csinh.c: New file.
* mingwex/complex/csqrt.c: New file.
* mingwex/complex/ctan.c: New file.
* mingwex/complex/ctanh.c: New file.
* mingwex/Makefile.in (COMPLEX_DISTFILES): New list of
files.
(dist): Use it.
(COMPLEX_OBJS): New list of objects.
(LIB_OBJS): Include it in the library.
Diffstat (limited to 'winsup/mingw/mingwex/complex/cpow.c')
-rw-r--r-- | winsup/mingw/mingwex/complex/cpow.c | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/winsup/mingw/mingwex/complex/cpow.c b/winsup/mingw/mingwex/complex/cpow.c new file mode 100644 index 000000000..c12b12fc0 --- /dev/null +++ b/winsup/mingw/mingwex/complex/cpow.c @@ -0,0 +1,48 @@ +/* cpow.c */ +/* + Contributed by Danny Smith + 2003-10-20 +*/ + +/* cpow(X, Y) = cexp(X * clog(Y)) */ + +#include <math.h> +#include <complex.h> + +/* Use dll version of pow */ +extern double (*_imp__pow) (double, double); +#define pow (*_imp__pow) + +double complex cpow (double complex X, double complex Y) +{ + double complex Res; + double i; + double r = hypot (__real__ X, __imag__ X); + if (r == 0.0) + { + __real__ Res = __imag__ Res = 0.0; + } + else + { + double rho; + double theta; + i = carg (X); + theta = i * __real__ Y; + + if (__imag__ Y == 0.0) + /* This gives slightly more accurate results in these cases. */ + rho = pow (r, __real__ Y); + else + { + r = log (r); + /* rearrangement of cexp(X * clog(Y)) */ + theta += r * __imag__ Y; + rho = exp (r * __real__ Y - i * __imag__ Y); + } + + __real__ Res = rho * cos (theta); + __imag__ Res = rho * sin (theta); + } + return Res; +} + |