summaryrefslogtreecommitdiff
path: root/lib/libm/cpow.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libm/cpow.c')
-rw-r--r--lib/libm/cpow.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/lib/libm/cpow.c b/lib/libm/cpow.c
new file mode 100644
index 00000000..d4aff129
--- /dev/null
+++ b/lib/libm/cpow.c
@@ -0,0 +1,20 @@
+#include "__complex.h"
+
+double complex cpow(double complex a, double complex z)
+{
+ double x, y, r, theta, absa, arga;
+ x = creal(z);
+ y = cimag(z);
+ absa = cabs(a);
+ if (absa == 0.0) {
+ return (0.0 + 0.0 * (double complex)I);
+ }
+ arga = carg(a);
+ r = pow(absa, x);
+ theta = x * arga;
+ if (y != 0.0) {
+ r = r * exp(-y * arga);
+ theta = theta + y * log(absa);
+ }
+ return r * cos(theta) + (r * sin(theta)) * (double complex)I;
+}