diff options
author | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2016-08-20 19:50:45 +0200 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2016-08-20 19:50:45 +0200 |
commit | 4dd9e35bfd35d3138bc44169baba098005bad51e (patch) | |
tree | a4939c43a9c3fe00eb27f023e14acc5e1fe8808c /math/s_ctanl.c | |
parent | bd42a4599d1b6f77bcfe1e4f67b7cbd9e1cb2dfd (diff) | |
parent | f76453c31593957fec1a99b986bfa5506618b79c (diff) |
Merge commit 'refs/top-bases/t/bigmem' into t/bigmem
Diffstat (limited to 'math/s_ctanl.c')
-rw-r--r-- | math/s_ctanl.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/math/s_ctanl.c b/math/s_ctanl.c index 98fdac0c8d..0fd0039053 100644 --- a/math/s_ctanl.c +++ b/math/s_ctanl.c @@ -1,5 +1,5 @@ /* Complex tangent function for long double. - Copyright (C) 1997-2014 Free Software Foundation, Inc. + Copyright (C) 1997-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. @@ -23,12 +23,19 @@ #include <math_private.h> #include <float.h> +/* To avoid spurious underflows, use this definition to treat IBM long + double as approximating an IEEE-style format. */ +#if LDBL_MANT_DIG == 106 +# undef LDBL_EPSILON +# define LDBL_EPSILON 0x1p-106L +#endif + __complex__ long double __ctanl (__complex__ long double x) { __complex__ long double res; - if (__builtin_expect (!isfinite (__real__ x) || !isfinite (__imag__ x), 0)) + if (__glibc_unlikely (!isfinite (__real__ x) || !isfinite (__imag__ x))) { if (__isinf_nsl (__imag__ x)) { @@ -53,12 +60,11 @@ __ctanl (__complex__ long double x) long double sinrx, cosrx; long double den; const int t = (int) ((LDBL_MAX_EXP - 1) * M_LN2l / 2); - int rcls = fpclassify (__real__ x); /* tan(x+iy) = (sin(2x) + i*sinh(2y))/(cos(2x) + cosh(2y)) = (sin(x)*cos(x) + i*sinh(y)*cosh(y)/(cos(x)^2 + sinh(y)^2). */ - if (__builtin_expect (rcls != FP_SUBNORMAL, 1)) + if (__glibc_likely (fabsl (__real__ x) > LDBL_MIN)) { __sincosl (__real__ x, &sinrx, &cosrx); } |