diff options
Diffstat (limited to 'sysdeps')
-rw-r--r-- | sysdeps/i386/fpu/libm-test-ulps | 4 | ||||
-rw-r--r-- | sysdeps/ieee754/dbl-64/s_tanh.c | 10 | ||||
-rw-r--r-- | sysdeps/ieee754/flt-32/s_tanhf.c | 8 | ||||
-rw-r--r-- | sysdeps/ieee754/ldbl-128/s_tanhl.c | 10 | ||||
-rw-r--r-- | sysdeps/ieee754/ldbl-128ibm/s_tanhl.c | 8 | ||||
-rw-r--r-- | sysdeps/ieee754/ldbl-96/s_tanhl.c | 8 |
6 files changed, 46 insertions, 2 deletions
diff --git a/sysdeps/i386/fpu/libm-test-ulps b/sysdeps/i386/fpu/libm-test-ulps index 36037655f2..de53451879 100644 --- a/sysdeps/i386/fpu/libm-test-ulps +++ b/sysdeps/i386/fpu/libm-test-ulps @@ -1988,12 +1988,16 @@ ldouble: 4 Function: "tanh_towardzero": double: 1 float: 1 +idouble: 1 +ifloat: 1 ildouble: 3 ldouble: 3 Function: "tanh_upward": double: 1 float: 1 +idouble: 1 +ifloat: 1 ildouble: 5 ldouble: 4 diff --git a/sysdeps/ieee754/dbl-64/s_tanh.c b/sysdeps/ieee754/dbl-64/s_tanh.c index 23cfcdead5..4f9fcfd2bd 100644 --- a/sysdeps/ieee754/dbl-64/s_tanh.c +++ b/sysdeps/ieee754/dbl-64/s_tanh.c @@ -38,6 +38,7 @@ static char rcsid[] = "$NetBSD: s_tanh.c,v 1.7 1995/05/10 20:48:22 jtc Exp $"; * only tanh(0)=0 is exact for finite argument. */ +#include <float.h> #include <math.h> #include <math_private.h> @@ -68,7 +69,14 @@ __tanh (double x) if ((ix | lx) == 0) return x; /* x == +-0 */ if (ix < 0x3c800000) /* |x|<2**-55 */ - return x * (one + x); /* tanh(small) = small */ + { + if (fabs (x) < DBL_MIN) + { + double force_underflow = x * x; + math_force_eval (force_underflow); + } + return x * (one + x); /* tanh(small) = small */ + } if (ix >= 0x3ff00000) /* |x|>=1 */ { t = __expm1 (two * fabs (x)); diff --git a/sysdeps/ieee754/flt-32/s_tanhf.c b/sysdeps/ieee754/flt-32/s_tanhf.c index dc96da9a5b..5b48fb2e00 100644 --- a/sysdeps/ieee754/flt-32/s_tanhf.c +++ b/sysdeps/ieee754/flt-32/s_tanhf.c @@ -17,6 +17,7 @@ static char rcsid[] = "$NetBSD: s_tanhf.c,v 1.4 1995/05/10 20:48:24 jtc Exp $"; #endif +#include <float.h> #include <math.h> #include <math_private.h> @@ -41,7 +42,14 @@ float __tanhf(float x) if (ix == 0) return x; /* x == +-0 */ if (ix<0x24000000) /* |x|<2**-55 */ + { + if (fabsf (x) < FLT_MIN) + { + float force_underflow = x * x; + math_force_eval (force_underflow); + } return x*(one+x); /* tanh(small) = small */ + } if (ix>=0x3f800000) { /* |x|>=1 */ t = __expm1f(two*fabsf(x)); z = one - two/(t+two); diff --git a/sysdeps/ieee754/ldbl-128/s_tanhl.c b/sysdeps/ieee754/ldbl-128/s_tanhl.c index 129735b1b5..8b1706fcdc 100644 --- a/sysdeps/ieee754/ldbl-128/s_tanhl.c +++ b/sysdeps/ieee754/ldbl-128/s_tanhl.c @@ -41,6 +41,7 @@ * only tanhl(0)=0 is exact for finite argument. */ +#include <float.h> #include <math.h> #include <math_private.h> @@ -73,7 +74,14 @@ __tanhl (long double x) if (u.value == 0) return x; /* x == +- 0 */ if (ix < 0x3fc60000) /* |x| < 2^-57 */ - return x * (one + tiny); /* tanh(small) = small */ + { + if (fabsl (x) < LDBL_MIN) + { + long double force_underflow = x * x; + math_force_eval (force_underflow); + } + return x * (one + tiny); /* tanh(small) = small */ + } u.parts32.w0 = ix; /* Absolute value of x. */ if (ix >= 0x3fff0000) { /* |x| >= 1 */ diff --git a/sysdeps/ieee754/ldbl-128ibm/s_tanhl.c b/sysdeps/ieee754/ldbl-128ibm/s_tanhl.c index fe396e9bd3..5342a8b19a 100644 --- a/sysdeps/ieee754/ldbl-128ibm/s_tanhl.c +++ b/sysdeps/ieee754/ldbl-128ibm/s_tanhl.c @@ -38,6 +38,7 @@ static char rcsid[] = "$NetBSD: s_tanh.c,v 1.7 1995/05/10 20:48:22 jtc Exp $"; * only tanh(0)=0 is exact for finite argument. */ +#include <float.h> #include <math.h> #include <math_private.h> #include <math_ldbl_opt.h> @@ -66,7 +67,14 @@ long double __tanhl(long double x) if (ix == 0) return x; /* x == +-0 */ if (ix<0x3c60000000000000LL) /* |x|<2**-57 */ + { + if (fabsl (x) < LDBL_MIN) + { + long double force_underflow = x * x; + math_force_eval (force_underflow); + } return x*(one+x); /* tanh(small) = small */ + } if (ix>=0x3ff0000000000000LL) { /* |x|>=1 */ t = __expm1l(two*fabsl(x)); z = one - two/(t+two); diff --git a/sysdeps/ieee754/ldbl-96/s_tanhl.c b/sysdeps/ieee754/ldbl-96/s_tanhl.c index 7ec6247315..035037c8c7 100644 --- a/sysdeps/ieee754/ldbl-96/s_tanhl.c +++ b/sysdeps/ieee754/ldbl-96/s_tanhl.c @@ -42,6 +42,7 @@ static char rcsid[] = "$NetBSD: $"; * only tanhl(0)=0 is exact for finite argument. */ +#include <float.h> #include <math.h> #include <math_private.h> @@ -69,7 +70,14 @@ long double __tanhl(long double x) if ((ix|j0|j1) == 0) return x; /* x == +- 0 */ if (ix<0x3fc8) /* |x|<2**-55 */ + { + if (fabsl (x) < LDBL_MIN) + { + long double force_underflow = x * x; + math_force_eval (force_underflow); + } return x*(one+tiny); /* tanh(small) = small */ + } if (ix>=0x3fff) { /* |x|>=1 */ t = __expm1l(two*fabsl(x)); z = one - two/(t+two); |