about summary refs log tree commit diff
path: root/math/s_cacosf.c
diff options
context:
space:
mode:
Diffstat (limited to 'math/s_cacosf.c')
-rw-r--r--math/s_cacosf.c26
1 files changed, 21 insertions, 5 deletions
diff --git a/math/s_cacosf.c b/math/s_cacosf.c
index 04c13e4fa5..df2bf218a3 100644
--- a/math/s_cacosf.c
+++ b/math/s_cacosf.c
@@ -25,11 +25,27 @@ __cacosf (__complex__ float x)
 {
   __complex__ float y;
   __complex__ float res;
-
-  y = __casinf (x);
-
-  __real__ res = (float) M_PI_2 - __real__ y;
-  __imag__ res = -__imag__ y;
+  int rcls = fpclassify (__real__ x);
+  int icls = fpclassify (__imag__ x);
+
+  if (rcls <= FP_INFINITE || icls <= FP_INFINITE
+      || (rcls == FP_ZERO && icls == FP_ZERO))
+    {
+      y = __casinf (x);
+
+      __real__ res = (float) M_PI_2 - __real__ y;
+      __imag__ res = -__imag__ y;
+    }
+  else
+    {
+      __real__ y = -__imag__ x;
+      __imag__ y = __real__ x;
+
+      y = __kernel_casinhf (y, 1);
+
+      __real__ res = __imag__ y;
+      __imag__ res = __real__ y;
+    }
 
   return res;
 }