about summary refs log tree commit diff
path: root/sysdeps/ieee754
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2015-08-10 20:35:30 +0000
committerJoseph Myers <joseph@codesourcery.com>2015-08-10 20:35:30 +0000
commit7ee06ef15827f8f2582a94b1ceaad47eaf502744 (patch)
treea9708093ad2f011a6a92b76e7aab574b72593649 /sysdeps/ieee754
parenteb32b0d40308166c4d8f6330cc2958cb1e545075 (diff)
downloadglibc-7ee06ef15827f8f2582a94b1ceaad47eaf502744.tar.gz
glibc-7ee06ef15827f8f2582a94b1ceaad47eaf502744.tar.xz
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/ieee754')
-rw-r--r--sysdeps/ieee754/ldbl-128ibm/s_tanhl.c10
1 files changed, 5 insertions, 5 deletions
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 */
 	}