summaryrefslogtreecommitdiff
path: root/lib/libm/cpowf.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libm/cpowf.c')
-rw-r--r--lib/libm/cpowf.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/lib/libm/cpowf.c b/lib/libm/cpowf.c
new file mode 100644
index 00000000..9bab4e8e
--- /dev/null
+++ b/lib/libm/cpowf.c
@@ -0,0 +1,20 @@
+#include "__complex.h"
+
+float complex cpowf(float complex a, float complex z)
+{
+ float x, y, r, theta, absa, arga;
+ x = crealf(z);
+ y = cimagf(z);
+ absa = cabsf(a);
+ if (absa == 0.0f) {
+ return (0.0f + 0.0f * I);
+ }
+ arga = cargf(a);
+ r = powf(absa, x);
+ theta = x * arga;
+ if (y != 0.0f) {
+ r = r * expf(-y * arga);
+ theta = theta + y * logf(absa);
+ }
+ return r * cosf(theta) + (r * sinf(theta)) * I;
+}