summaryrefslogtreecommitdiff
path: root/lib/libm/cpowl.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libm/cpowl.c')
-rw-r--r--lib/libm/cpowl.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/lib/libm/cpowl.c b/lib/libm/cpowl.c
new file mode 100644
index 00000000..b7471f0a
--- /dev/null
+++ b/lib/libm/cpowl.c
@@ -0,0 +1,20 @@
+#include "__complex.h"
+
+long double complex cpowl(long double complex a, long double complex z)
+{
+ long double x, y, r, theta, absa, arga;
+ x = creall(z);
+ y = cimagl(z);
+ absa = cabsl(a);
+ if (absa == 0.0L) {
+ return (0.0L + 0.0L * (long double complex)I);
+ }
+ arga = cargl(a);
+ r = powl(absa, x);
+ theta = x * arga;
+ if (y != 0.0L) {
+ r = r * expl(-y * arga);
+ theta = theta + y * logl(absa);
+ }
+ return r * cosl(theta) + (r * sinl(theta)) * (long double complex)I;
+}