diff options
author | Joseph Myers <joseph@codesourcery.com> | 2013-01-17 20:25:51 +0000 |
---|---|---|
committer | Joseph Myers <joseph@codesourcery.com> | 2013-01-17 20:25:51 +0000 |
commit | 728d7b43fc8a4f9b3ec772fd8b75a39b945e9f04 (patch) | |
tree | 4033b2b21fd505dc1b607ea1ed589818fe838ef2 /math/s_cacosf.c | |
parent | 2a26ef3a012cc29623423ca52c1cc8001d847d54 (diff) | |
download | glibc-728d7b43fc8a4f9b3ec772fd8b75a39b945e9f04.tar.gz glibc-728d7b43fc8a4f9b3ec772fd8b75a39b945e9f04.tar.xz glibc-728d7b43fc8a4f9b3ec772fd8b75a39b945e9f04.zip |
Fix cacos real-part inaccuracy for result real part near 0 (bug 15023).
Diffstat (limited to 'math/s_cacosf.c')
-rw-r--r-- | math/s_cacosf.c | 26 |
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; } |