diff options
author | Joseph Myers <joseph@codesourcery.com> | 2015-08-10 20:35:30 +0000 |
---|---|---|
committer | Joseph Myers <joseph@codesourcery.com> | 2015-08-10 20:35:30 +0000 |
commit | 7ee06ef15827f8f2582a94b1ceaad47eaf502744 (patch) | |
tree | a9708093ad2f011a6a92b76e7aab574b72593649 /sysdeps | |
parent | eb32b0d40308166c4d8f6330cc2958cb1e545075 (diff) | |
download | glibc-7ee06ef15827f8f2582a94b1ceaad47eaf502744.tar glibc-7ee06ef15827f8f2582a94b1ceaad47eaf502744.tar.gz glibc-7ee06ef15827f8f2582a94b1ceaad47eaf502744.tar.bz2 glibc-7ee06ef15827f8f2582a94b1ceaad47eaf502744.zip |
Fix ldbl-128ibm tanhl inaccuracy (bug 18790).
ldbl-128ibm tanhl uses a too-small threshold to decide when to return
+/-1, resulting in large errors. This patch changes it to a more
appropriate threshold (the requirement is for 2*exp(-2|x|) to be small
in terms of ulps of 1).
Tested for x86_64, x86 and powerpc.
[BZ #18790]
* sysdeps/ieee754/ldbl-128ibm/s_tanhl.c (__tanhl): Increase
threshold for returning +/- 1.
* math/auto-libm-test-in: Add more tests of tanh.
* math/auto-libm-test-out: Regenerated.
* sysdeps/i386/fpu/libm-test-ulps: Update.
Diffstat (limited to 'sysdeps')
-rw-r--r-- | sysdeps/i386/fpu/libm-test-ulps | 2 | ||||
-rw-r--r-- | sysdeps/ieee754/ldbl-128ibm/s_tanhl.c | 10 |
2 files changed, 6 insertions, 6 deletions
diff --git a/sysdeps/i386/fpu/libm-test-ulps b/sysdeps/i386/fpu/libm-test-ulps index eddb3dc990..dbc8f2f331 100644 --- a/sysdeps/i386/fpu/libm-test-ulps +++ b/sysdeps/i386/fpu/libm-test-ulps @@ -1924,7 +1924,7 @@ double: 1 float: 1 idouble: 1 ifloat: 1 -ildouble: 5 +ildouble: 7 ldouble: 4 Function: "tanh_towardzero": diff --git a/sysdeps/ieee754/ldbl-128ibm/s_tanhl.c b/sysdeps/ieee754/ldbl-128ibm/s_tanhl.c index c63e25345d..fe396e9bd3 100644 --- a/sysdeps/ieee754/ldbl-128ibm/s_tanhl.c +++ b/sysdeps/ieee754/ldbl-128ibm/s_tanhl.c @@ -29,9 +29,9 @@ static char rcsid[] = "$NetBSD: s_tanh.c,v 1.7 1995/05/10 20:48:22 jtc Exp $"; * 2**-57 < x <= 1 : tanh(x) := -----; t = expm1(-2x) * t + 2 * 2 - * 1 <= x <= 22.0 : tanh(x) := 1- ----- ; t=expm1(2x) + * 1 <= x <= 40.0 : tanh(x) := 1- ----- ; t=expm1(2x) * t + 2 - * 22.0 < x <= INF : tanh(x) := 1. + * 40.0 < x <= INF : tanh(x) := 1. * * Special cases: * tanh(NaN) is NaN; @@ -61,8 +61,8 @@ long double __tanhl(long double x) else return one/x-one; /* tanh(NaN) = NaN */ } - /* |x| < 22 */ - if (ix < 0x4036000000000000LL) { /* |x|<22 */ + /* |x| < 40 */ + if (ix < 0x4044000000000000LL) { /* |x|<40 */ if (ix == 0) return x; /* x == +-0 */ if (ix<0x3c60000000000000LL) /* |x|<2**-57 */ @@ -74,7 +74,7 @@ long double __tanhl(long double x) t = __expm1l(-two*fabsl(x)); z= -t/(t+two); } - /* |x| > 22, return +-1 */ + /* |x| > 40, return +-1 */ } else { z = one - tiny; /* raised inexact flag */ } |