This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Fix ldbl-128ibm tanhl inaccuracy for small arguments (bug 19349) [committed]
- From: Joseph Myers <joseph at codesourcery dot com>
- To: <libc-alpha at sourceware dot org>
- Date: Wed, 9 Dec 2015 21:21:03 +0000
- Subject: Fix ldbl-128ibm tanhl inaccuracy for small arguments (bug 19349) [committed]
- Authentication-results: sourceware.org; auth=none
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. Committed.
2015-12-09 Joseph Myers <joseph@codesourcery.com>
[BZ #19349]
* sysdeps/ieee754/ldbl-128ibm/s_tanhl.c (__tanhl): Return argument
when small.
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));
--
Joseph S. Myers
joseph@codesourcery.com