diff options
Diffstat (limited to 'math/s_ctanf.c')
-rw-r--r-- | math/s_ctanf.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/math/s_ctanf.c b/math/s_ctanf.c index e0a6b8f07c..0db2c90310 100644 --- a/math/s_ctanf.c +++ b/math/s_ctanf.c @@ -1,5 +1,5 @@ /* Complex tangent function for float. - Copyright (C) 1997-2015 Free Software Foundation, Inc. + Copyright (C) 1997-2016 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. @@ -30,9 +30,16 @@ __ctanf (__complex__ float x) if (__glibc_unlikely (!isfinite (__real__ x) || !isfinite (__imag__ x))) { - if (__isinf_nsf (__imag__ x)) + if (isinf (__imag__ x)) { - __real__ res = __copysignf (0.0, __real__ x); + if (isfinite (__real__ x) && fabsf (__real__ x) > 1.0f) + { + float sinrx, cosrx; + __sincosf (__real__ x, &sinrx, &cosrx); + __real__ res = __copysignf (0.0f, sinrx * cosrx); + } + else + __real__ res = __copysignf (0.0, __real__ x); __imag__ res = __copysignf (1.0, __imag__ x); } else if (__real__ x == 0.0) @@ -44,7 +51,7 @@ __ctanf (__complex__ float x) __real__ res = __nanf (""); __imag__ res = __nanf (""); - if (__isinf_nsf (__real__ x)) + if (isinf (__real__ x)) feraiseexcept (FE_INVALID); } } @@ -110,6 +117,7 @@ __ctanf (__complex__ float x) __real__ res = sinrx * cosrx / den; __imag__ res = sinhix * coshix / den; } + math_check_force_underflow_complex (res); } return res; |