From ca2fcac629b9b7781ccd52685b28741d89ff128f Mon Sep 17 00:00:00 2001 From: Joseph Myers Date: Wed, 9 Dec 2015 21:20:18 +0000 Subject: Fix ldbl-128ibm tanhl inaccuracy for small arguments (bug 19349). The ldbl-128ibm implementation of tanhl is inaccurate for small arguments, because it returns x*(1+x) (maybe in an attempt to raise "inexact") when x itself would be the accurate return value but multiplying by 1+x introduces large errors. This patch fixes it to return x in that case (when the mathematical result is x plus a negligible remainder on the order of x^3) to avoid those errors. Tested for powerpc. [BZ #19349] * sysdeps/ieee754/ldbl-128ibm/s_tanhl.c (__tanhl): Return argument when small. --- sysdeps/ieee754/ldbl-128ibm/s_tanhl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'sysdeps') diff --git a/sysdeps/ieee754/ldbl-128ibm/s_tanhl.c b/sysdeps/ieee754/ldbl-128ibm/s_tanhl.c index 292020c..e6457a1 100644 --- a/sysdeps/ieee754/ldbl-128ibm/s_tanhl.c +++ b/sysdeps/ieee754/ldbl-128ibm/s_tanhl.c @@ -69,7 +69,7 @@ long double __tanhl(long double x) if (ix<0x3c60000000000000LL) /* |x|<2**-57 */ { math_check_force_underflow (x); - return x*(one+x); /* tanh(small) = small */ + return x; /* tanh(small) = small */ } if (ix>=0x3ff0000000000000LL) { /* |x|>=1 */ t = __expm1l(two*fabsl(x)); -- cgit v1.1