newlib/winsup/mingw/mingwex/complex/cpow.c
Danny Smith 3c7a7a5fca 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.
2003-10-21 09:43:22 +00:00

49 lines
945 B
C

/* 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;
}