about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog22
-rw-r--r--NEWS4
-rw-r--r--math/auto-libm-test-in4
-rw-r--r--math/auto-libm-test-out316
-rw-r--r--sysdeps/i386/fpu/libm-test-ulps4
-rw-r--r--sysdeps/ieee754/dbl-64/s_tanh.c10
-rw-r--r--sysdeps/ieee754/flt-32/s_tanhf.c8
-rw-r--r--sysdeps/ieee754/ldbl-128/s_tanhl.c10
-rw-r--r--sysdeps/ieee754/ldbl-128ibm/s_tanhl.c8
-rw-r--r--sysdeps/ieee754/ldbl-96/s_tanhl.c8
10 files changed, 390 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog
index 3f55c55a1d..dbb7b467f6 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,25 @@
+2015-08-13  Joseph Myers  <joseph@codesourcery.com>
+
+	[BZ #16520]
+	* sysdeps/ieee754/dbl-64/s_tanh.c: Include <float.h>.
+	(__tanh): Force underflow exception for arguments with small
+	absolute value.
+	* sysdeps/ieee754/flt-32/s_tanhf.c: Include <float.h>.
+	(__tanhf): Force underflow exception for arguments with small
+	absolute value.
+	* sysdeps/ieee754/ldbl-128/s_tanhl.c: Include <float.h>.
+	(__tanhl): Force underflow exception for arguments with small
+	absolute value.
+	* sysdeps/ieee754/ldbl-128ibm/s_tanhl.c: Include <float.h>.
+	(__tanhl): Force underflow exception for arguments with small
+	absolute value.
+	* sysdeps/ieee754/ldbl-96/s_tanhl.c: Include <float.h>.
+	(__tanhl): Force underflow exception for arguments with small
+	absolute value.
+	* math/auto-libm-test-in: Add more tests of tanh.
+	* math/auto-libm-test-out: Regenerated.
+	* sysdeps/i386/fpu/libm-test-ulps: Update.
+
 2015-08-13  H.J. Lu  <hongjiu.lu@intel.com>
 
 	* sysdeps/x86/cpu-features.c (init_cpu_features): Call
diff --git a/NEWS b/NEWS
index ea8bb6d7ca..5ca3de8353 100644
--- a/NEWS
+++ b/NEWS
@@ -9,8 +9,8 @@ Version 2.23
 
 * The following bugs are resolved with this release:
 
-  16517, 16519, 16734, 17905, 18086, 18265, 18480, 18525, 18618, 18647,
-  18661, 18674, 18778, 18781, 18787, 18789, 18790, 18820.
+  16517, 16519, 16520, 16734, 17905, 18086, 18265, 18480, 18525, 18618,
+  18647, 18661, 18674, 18778, 18781, 18787, 18789, 18790, 18820.
 
 
 Version 2.22
diff --git a/math/auto-libm-test-in b/math/auto-libm-test-in
index c32e436905..b14146e2b6 100644
--- a/math/auto-libm-test-in
+++ b/math/auto-libm-test-in
@@ -2779,6 +2779,10 @@ tanh -0x2.6082fp-4
 tanh 0xe.05031p-16
 tanh 0x3.c80eaa7adaa3p-4
 tanh 0x2.00f9857616524p-4
+tanh min
+tanh -min
+tanh min_subnorm
+tanh -min_subnorm
 
 tgamma 0.5
 tgamma -0.5
diff --git a/math/auto-libm-test-out b/math/auto-libm-test-out
index b4114be3d8..4d8bcf2f08 100644
--- a/math/auto-libm-test-out
+++ b/math/auto-libm-test-out
@@ -205177,6 +205177,322 @@ tanh 0x2.00f9857616524p-4
 = tanh tonearest ldbl-128ibm 0x2.00f9857616524p-4L : 0x1.fe4f3a8e0515344ff794387d93p-4L : inexact-ok
 = tanh towardzero ldbl-128ibm 0x2.00f9857616524p-4L : 0x1.fe4f3a8e0515344ff794387d928p-4L : inexact-ok
 = tanh upward ldbl-128ibm 0x2.00f9857616524p-4L : 0x1.fe4f3a8e0515344ff794387d93p-4L : inexact-ok
+tanh min
+= tanh downward flt-32 0x4p-128f : 0x3.fffff8p-128f : inexact-ok underflow-ok errno-erange-ok
+= tanh tonearest flt-32 0x4p-128f : 0x4p-128f : inexact-ok underflow-ok errno-erange-ok
+= tanh towardzero flt-32 0x4p-128f : 0x3.fffff8p-128f : inexact-ok underflow-ok errno-erange-ok
+= tanh upward flt-32 0x4p-128f : 0x4p-128f : inexact-ok underflow-ok errno-erange-ok
+= tanh downward dbl-64 0x4p-128 : 0x3.ffffffffffffep-128 : inexact-ok
+= tanh tonearest dbl-64 0x4p-128 : 0x4p-128 : inexact-ok
+= tanh towardzero dbl-64 0x4p-128 : 0x3.ffffffffffffep-128 : inexact-ok
+= tanh upward dbl-64 0x4p-128 : 0x4p-128 : inexact-ok
+= tanh downward ldbl-96-intel 0x4p-128L : 0x3.fffffffffffffffcp-128L : inexact-ok
+= tanh tonearest ldbl-96-intel 0x4p-128L : 0x4p-128L : inexact-ok
+= tanh towardzero ldbl-96-intel 0x4p-128L : 0x3.fffffffffffffffcp-128L : inexact-ok
+= tanh upward ldbl-96-intel 0x4p-128L : 0x4p-128L : inexact-ok
+= tanh downward ldbl-96-m68k 0x4p-128L : 0x3.fffffffffffffffcp-128L : inexact-ok
+= tanh tonearest ldbl-96-m68k 0x4p-128L : 0x4p-128L : inexact-ok
+= tanh towardzero ldbl-96-m68k 0x4p-128L : 0x3.fffffffffffffffcp-128L : inexact-ok
+= tanh upward ldbl-96-m68k 0x4p-128L : 0x4p-128L : inexact-ok
+= tanh downward ldbl-128 0x4p-128L : 0x3.fffffffffffffffffffffffffffep-128L : inexact-ok
+= tanh tonearest ldbl-128 0x4p-128L : 0x4p-128L : inexact-ok
+= tanh towardzero ldbl-128 0x4p-128L : 0x3.fffffffffffffffffffffffffffep-128L : inexact-ok
+= tanh upward ldbl-128 0x4p-128L : 0x4p-128L : inexact-ok
+= tanh downward ldbl-128ibm 0x4p-128L : 0x3.ffffffffffffffffffffffffffp-128L : inexact-ok
+= tanh tonearest ldbl-128ibm 0x4p-128L : 0x4p-128L : inexact-ok
+= tanh towardzero ldbl-128ibm 0x4p-128L : 0x3.ffffffffffffffffffffffffffp-128L : inexact-ok
+= tanh upward ldbl-128ibm 0x4p-128L : 0x4p-128L : inexact-ok
+= tanh downward dbl-64 0x4p-1024 : 0x3.ffffffffffffcp-1024 : inexact-ok underflow-ok errno-erange-ok
+= tanh tonearest dbl-64 0x4p-1024 : 0x4p-1024 : inexact-ok underflow-ok errno-erange-ok
+= tanh towardzero dbl-64 0x4p-1024 : 0x3.ffffffffffffcp-1024 : inexact-ok underflow-ok errno-erange-ok
+= tanh upward dbl-64 0x4p-1024 : 0x4p-1024 : inexact-ok underflow-ok errno-erange-ok
+= tanh downward ldbl-96-intel 0x4p-1024L : 0x3.fffffffffffffffcp-1024L : inexact-ok
+= tanh tonearest ldbl-96-intel 0x4p-1024L : 0x4p-1024L : inexact-ok
+= tanh towardzero ldbl-96-intel 0x4p-1024L : 0x3.fffffffffffffffcp-1024L : inexact-ok
+= tanh upward ldbl-96-intel 0x4p-1024L : 0x4p-1024L : inexact-ok
+= tanh downward ldbl-96-m68k 0x4p-1024L : 0x3.fffffffffffffffcp-1024L : inexact-ok
+= tanh tonearest ldbl-96-m68k 0x4p-1024L : 0x4p-1024L : inexact-ok
+= tanh towardzero ldbl-96-m68k 0x4p-1024L : 0x3.fffffffffffffffcp-1024L : inexact-ok
+= tanh upward ldbl-96-m68k 0x4p-1024L : 0x4p-1024L : inexact-ok
+= tanh downward ldbl-128 0x4p-1024L : 0x3.fffffffffffffffffffffffffffep-1024L : inexact-ok
+= tanh tonearest ldbl-128 0x4p-1024L : 0x4p-1024L : inexact-ok
+= tanh towardzero ldbl-128 0x4p-1024L : 0x3.fffffffffffffffffffffffffffep-1024L : inexact-ok
+= tanh upward ldbl-128 0x4p-1024L : 0x4p-1024L : inexact-ok
+= tanh downward ldbl-128ibm 0x4p-1024L : 0x3.ffffffffffffcp-1024L : inexact-ok underflow errno-erange-ok
+= tanh tonearest ldbl-128ibm 0x4p-1024L : 0x4p-1024L : inexact-ok underflow errno-erange-ok
+= tanh towardzero ldbl-128ibm 0x4p-1024L : 0x3.ffffffffffffcp-1024L : inexact-ok underflow errno-erange-ok
+= tanh upward ldbl-128ibm 0x4p-1024L : 0x4p-1024L : inexact-ok underflow errno-erange-ok
+= tanh downward ldbl-96-intel 0x4p-16384L : 0x3.fffffffffffffff8p-16384L : inexact-ok underflow-ok errno-erange-ok
+= tanh tonearest ldbl-96-intel 0x4p-16384L : 0x4p-16384L : inexact-ok underflow-ok errno-erange-ok
+= tanh towardzero ldbl-96-intel 0x4p-16384L : 0x3.fffffffffffffff8p-16384L : inexact-ok underflow-ok errno-erange-ok
+= tanh upward ldbl-96-intel 0x4p-16384L : 0x4p-16384L : inexact-ok underflow-ok errno-erange-ok
+= tanh downward ldbl-96-m68k 0x4p-16384L : 0x3.fffffffffffffffcp-16384L : inexact-ok
+= tanh tonearest ldbl-96-m68k 0x4p-16384L : 0x4p-16384L : inexact-ok
+= tanh towardzero ldbl-96-m68k 0x4p-16384L : 0x3.fffffffffffffffcp-16384L : inexact-ok
+= tanh upward ldbl-96-m68k 0x4p-16384L : 0x4p-16384L : inexact-ok
+= tanh downward ldbl-128 0x4p-16384L : 0x3.fffffffffffffffffffffffffffcp-16384L : inexact-ok underflow-ok errno-erange-ok
+= tanh tonearest ldbl-128 0x4p-16384L : 0x4p-16384L : inexact-ok underflow-ok errno-erange-ok
+= tanh towardzero ldbl-128 0x4p-16384L : 0x3.fffffffffffffffffffffffffffcp-16384L : inexact-ok underflow-ok errno-erange-ok
+= tanh upward ldbl-128 0x4p-16384L : 0x4p-16384L : inexact-ok underflow-ok errno-erange-ok
+= tanh downward ldbl-96-intel 0x2p-16384L : 0x1.fffffffffffffff8p-16384L : inexact-ok underflow errno-erange-ok
+= tanh tonearest ldbl-96-intel 0x2p-16384L : 0x2p-16384L : inexact-ok underflow errno-erange-ok
+= tanh towardzero ldbl-96-intel 0x2p-16384L : 0x1.fffffffffffffff8p-16384L : inexact-ok underflow errno-erange-ok
+= tanh upward ldbl-96-intel 0x2p-16384L : 0x2p-16384L : inexact-ok underflow errno-erange-ok
+= tanh downward ldbl-96-m68k 0x2p-16384L : 0x1.fffffffffffffffcp-16384L : inexact-ok underflow-ok errno-erange-ok
+= tanh tonearest ldbl-96-m68k 0x2p-16384L : 0x2p-16384L : inexact-ok underflow-ok errno-erange-ok
+= tanh towardzero ldbl-96-m68k 0x2p-16384L : 0x1.fffffffffffffffcp-16384L : inexact-ok underflow-ok errno-erange-ok
+= tanh upward ldbl-96-m68k 0x2p-16384L : 0x2p-16384L : inexact-ok underflow-ok errno-erange-ok
+= tanh downward ldbl-128 0x2p-16384L : 0x1.fffffffffffffffffffffffffffcp-16384L : inexact-ok underflow errno-erange-ok
+= tanh tonearest ldbl-128 0x2p-16384L : 0x2p-16384L : inexact-ok underflow errno-erange-ok
+= tanh towardzero ldbl-128 0x2p-16384L : 0x1.fffffffffffffffffffffffffffcp-16384L : inexact-ok underflow errno-erange-ok
+= tanh upward ldbl-128 0x2p-16384L : 0x2p-16384L : inexact-ok underflow errno-erange-ok
+= tanh downward dbl-64 0x8p-972 : 0x7.ffffffffffffcp-972 : inexact-ok
+= tanh tonearest dbl-64 0x8p-972 : 0x8p-972 : inexact-ok
+= tanh towardzero dbl-64 0x8p-972 : 0x7.ffffffffffffcp-972 : inexact-ok
+= tanh upward dbl-64 0x8p-972 : 0x8p-972 : inexact-ok
+= tanh downward ldbl-96-intel 0x8p-972L : 0x7.fffffffffffffff8p-972L : inexact-ok
+= tanh tonearest ldbl-96-intel 0x8p-972L : 0x8p-972L : inexact-ok
+= tanh towardzero ldbl-96-intel 0x8p-972L : 0x7.fffffffffffffff8p-972L : inexact-ok
+= tanh upward ldbl-96-intel 0x8p-972L : 0x8p-972L : inexact-ok
+= tanh downward ldbl-96-m68k 0x8p-972L : 0x7.fffffffffffffff8p-972L : inexact-ok
+= tanh tonearest ldbl-96-m68k 0x8p-972L : 0x8p-972L : inexact-ok
+= tanh towardzero ldbl-96-m68k 0x8p-972L : 0x7.fffffffffffffff8p-972L : inexact-ok
+= tanh upward ldbl-96-m68k 0x8p-972L : 0x8p-972L : inexact-ok
+= tanh downward ldbl-128 0x8p-972L : 0x7.fffffffffffffffffffffffffffcp-972L : inexact-ok
+= tanh tonearest ldbl-128 0x8p-972L : 0x8p-972L : inexact-ok
+= tanh towardzero ldbl-128 0x8p-972L : 0x7.fffffffffffffffffffffffffffcp-972L : inexact-ok
+= tanh upward ldbl-128 0x8p-972L : 0x8p-972L : inexact-ok
+= tanh downward ldbl-128ibm 0x8p-972L : 0x7.fffffffffffffffffffffffffcp-972L : inexact-ok underflow-ok errno-erange-ok
+= tanh tonearest ldbl-128ibm 0x8p-972L : 0x8p-972L : inexact-ok underflow-ok errno-erange-ok
+= tanh towardzero ldbl-128ibm 0x8p-972L : 0x7.fffffffffffffffffffffffffcp-972L : inexact-ok underflow-ok errno-erange-ok
+= tanh upward ldbl-128ibm 0x8p-972L : 0x8p-972L : inexact-ok underflow-ok errno-erange-ok
+tanh -min
+= tanh downward flt-32 -0x4p-128f : -0x4p-128f : inexact-ok underflow-ok errno-erange-ok
+= tanh tonearest flt-32 -0x4p-128f : -0x4p-128f : inexact-ok underflow-ok errno-erange-ok
+= tanh towardzero flt-32 -0x4p-128f : -0x3.fffff8p-128f : inexact-ok underflow-ok errno-erange-ok
+= tanh upward flt-32 -0x4p-128f : -0x3.fffff8p-128f : inexact-ok underflow-ok errno-erange-ok
+= tanh downward dbl-64 -0x4p-128 : -0x4p-128 : inexact-ok
+= tanh tonearest dbl-64 -0x4p-128 : -0x4p-128 : inexact-ok
+= tanh towardzero dbl-64 -0x4p-128 : -0x3.ffffffffffffep-128 : inexact-ok
+= tanh upward dbl-64 -0x4p-128 : -0x3.ffffffffffffep-128 : inexact-ok
+= tanh downward ldbl-96-intel -0x4p-128L : -0x4p-128L : inexact-ok
+= tanh tonearest ldbl-96-intel -0x4p-128L : -0x4p-128L : inexact-ok
+= tanh towardzero ldbl-96-intel -0x4p-128L : -0x3.fffffffffffffffcp-128L : inexact-ok
+= tanh upward ldbl-96-intel -0x4p-128L : -0x3.fffffffffffffffcp-128L : inexact-ok
+= tanh downward ldbl-96-m68k -0x4p-128L : -0x4p-128L : inexact-ok
+= tanh tonearest ldbl-96-m68k -0x4p-128L : -0x4p-128L : inexact-ok
+= tanh towardzero ldbl-96-m68k -0x4p-128L : -0x3.fffffffffffffffcp-128L : inexact-ok
+= tanh upward ldbl-96-m68k -0x4p-128L : -0x3.fffffffffffffffcp-128L : inexact-ok
+= tanh downward ldbl-128 -0x4p-128L : -0x4p-128L : inexact-ok
+= tanh tonearest ldbl-128 -0x4p-128L : -0x4p-128L : inexact-ok
+= tanh towardzero ldbl-128 -0x4p-128L : -0x3.fffffffffffffffffffffffffffep-128L : inexact-ok
+= tanh upward ldbl-128 -0x4p-128L : -0x3.fffffffffffffffffffffffffffep-128L : inexact-ok
+= tanh downward ldbl-128ibm -0x4p-128L : -0x4p-128L : inexact-ok
+= tanh tonearest ldbl-128ibm -0x4p-128L : -0x4p-128L : inexact-ok
+= tanh towardzero ldbl-128ibm -0x4p-128L : -0x3.ffffffffffffffffffffffffffp-128L : inexact-ok
+= tanh upward ldbl-128ibm -0x4p-128L : -0x3.ffffffffffffffffffffffffffp-128L : inexact-ok
+= tanh downward dbl-64 -0x4p-1024 : -0x4p-1024 : inexact-ok underflow-ok errno-erange-ok
+= tanh tonearest dbl-64 -0x4p-1024 : -0x4p-1024 : inexact-ok underflow-ok errno-erange-ok
+= tanh towardzero dbl-64 -0x4p-1024 : -0x3.ffffffffffffcp-1024 : inexact-ok underflow-ok errno-erange-ok
+= tanh upward dbl-64 -0x4p-1024 : -0x3.ffffffffffffcp-1024 : inexact-ok underflow-ok errno-erange-ok
+= tanh downward ldbl-96-intel -0x4p-1024L : -0x4p-1024L : inexact-ok
+= tanh tonearest ldbl-96-intel -0x4p-1024L : -0x4p-1024L : inexact-ok
+= tanh towardzero ldbl-96-intel -0x4p-1024L : -0x3.fffffffffffffffcp-1024L : inexact-ok
+= tanh upward ldbl-96-intel -0x4p-1024L : -0x3.fffffffffffffffcp-1024L : inexact-ok
+= tanh downward ldbl-96-m68k -0x4p-1024L : -0x4p-1024L : inexact-ok
+= tanh tonearest ldbl-96-m68k -0x4p-1024L : -0x4p-1024L : inexact-ok
+= tanh towardzero ldbl-96-m68k -0x4p-1024L : -0x3.fffffffffffffffcp-1024L : inexact-ok
+= tanh upward ldbl-96-m68k -0x4p-1024L : -0x3.fffffffffffffffcp-1024L : inexact-ok
+= tanh downward ldbl-128 -0x4p-1024L : -0x4p-1024L : inexact-ok
+= tanh tonearest ldbl-128 -0x4p-1024L : -0x4p-1024L : inexact-ok
+= tanh towardzero ldbl-128 -0x4p-1024L : -0x3.fffffffffffffffffffffffffffep-1024L : inexact-ok
+= tanh upward ldbl-128 -0x4p-1024L : -0x3.fffffffffffffffffffffffffffep-1024L : inexact-ok
+= tanh downward ldbl-128ibm -0x4p-1024L : -0x4p-1024L : inexact-ok underflow errno-erange-ok
+= tanh tonearest ldbl-128ibm -0x4p-1024L : -0x4p-1024L : inexact-ok underflow errno-erange-ok
+= tanh towardzero ldbl-128ibm -0x4p-1024L : -0x3.ffffffffffffcp-1024L : inexact-ok underflow errno-erange-ok
+= tanh upward ldbl-128ibm -0x4p-1024L : -0x3.ffffffffffffcp-1024L : inexact-ok underflow errno-erange-ok
+= tanh downward ldbl-96-intel -0x4p-16384L : -0x4p-16384L : inexact-ok underflow-ok errno-erange-ok
+= tanh tonearest ldbl-96-intel -0x4p-16384L : -0x4p-16384L : inexact-ok underflow-ok errno-erange-ok
+= tanh towardzero ldbl-96-intel -0x4p-16384L : -0x3.fffffffffffffff8p-16384L : inexact-ok underflow-ok errno-erange-ok
+= tanh upward ldbl-96-intel -0x4p-16384L : -0x3.fffffffffffffff8p-16384L : inexact-ok underflow-ok errno-erange-ok
+= tanh downward ldbl-96-m68k -0x4p-16384L : -0x4p-16384L : inexact-ok
+= tanh tonearest ldbl-96-m68k -0x4p-16384L : -0x4p-16384L : inexact-ok
+= tanh towardzero ldbl-96-m68k -0x4p-16384L : -0x3.fffffffffffffffcp-16384L : inexact-ok
+= tanh upward ldbl-96-m68k -0x4p-16384L : -0x3.fffffffffffffffcp-16384L : inexact-ok
+= tanh downward ldbl-128 -0x4p-16384L : -0x4p-16384L : inexact-ok underflow-ok errno-erange-ok
+= tanh tonearest ldbl-128 -0x4p-16384L : -0x4p-16384L : inexact-ok underflow-ok errno-erange-ok
+= tanh towardzero ldbl-128 -0x4p-16384L : -0x3.fffffffffffffffffffffffffffcp-16384L : inexact-ok underflow-ok errno-erange-ok
+= tanh upward ldbl-128 -0x4p-16384L : -0x3.fffffffffffffffffffffffffffcp-16384L : inexact-ok underflow-ok errno-erange-ok
+= tanh downward ldbl-96-intel -0x2p-16384L : -0x2p-16384L : inexact-ok underflow errno-erange-ok
+= tanh tonearest ldbl-96-intel -0x2p-16384L : -0x2p-16384L : inexact-ok underflow errno-erange-ok
+= tanh towardzero ldbl-96-intel -0x2p-16384L : -0x1.fffffffffffffff8p-16384L : inexact-ok underflow errno-erange-ok
+= tanh upward ldbl-96-intel -0x2p-16384L : -0x1.fffffffffffffff8p-16384L : inexact-ok underflow errno-erange-ok
+= tanh downward ldbl-96-m68k -0x2p-16384L : -0x2p-16384L : inexact-ok underflow-ok errno-erange-ok
+= tanh tonearest ldbl-96-m68k -0x2p-16384L : -0x2p-16384L : inexact-ok underflow-ok errno-erange-ok
+= tanh towardzero ldbl-96-m68k -0x2p-16384L : -0x1.fffffffffffffffcp-16384L : inexact-ok underflow-ok errno-erange-ok
+= tanh upward ldbl-96-m68k -0x2p-16384L : -0x1.fffffffffffffffcp-16384L : inexact-ok underflow-ok errno-erange-ok
+= tanh downward ldbl-128 -0x2p-16384L : -0x2p-16384L : inexact-ok underflow errno-erange-ok
+= tanh tonearest ldbl-128 -0x2p-16384L : -0x2p-16384L : inexact-ok underflow errno-erange-ok
+= tanh towardzero ldbl-128 -0x2p-16384L : -0x1.fffffffffffffffffffffffffffcp-16384L : inexact-ok underflow errno-erange-ok
+= tanh upward ldbl-128 -0x2p-16384L : -0x1.fffffffffffffffffffffffffffcp-16384L : inexact-ok underflow errno-erange-ok
+= tanh downward dbl-64 -0x8p-972 : -0x8p-972 : inexact-ok
+= tanh tonearest dbl-64 -0x8p-972 : -0x8p-972 : inexact-ok
+= tanh towardzero dbl-64 -0x8p-972 : -0x7.ffffffffffffcp-972 : inexact-ok
+= tanh upward dbl-64 -0x8p-972 : -0x7.ffffffffffffcp-972 : inexact-ok
+= tanh downward ldbl-96-intel -0x8p-972L : -0x8p-972L : inexact-ok
+= tanh tonearest ldbl-96-intel -0x8p-972L : -0x8p-972L : inexact-ok
+= tanh towardzero ldbl-96-intel -0x8p-972L : -0x7.fffffffffffffff8p-972L : inexact-ok
+= tanh upward ldbl-96-intel -0x8p-972L : -0x7.fffffffffffffff8p-972L : inexact-ok
+= tanh downward ldbl-96-m68k -0x8p-972L : -0x8p-972L : inexact-ok
+= tanh tonearest ldbl-96-m68k -0x8p-972L : -0x8p-972L : inexact-ok
+= tanh towardzero ldbl-96-m68k -0x8p-972L : -0x7.fffffffffffffff8p-972L : inexact-ok
+= tanh upward ldbl-96-m68k -0x8p-972L : -0x7.fffffffffffffff8p-972L : inexact-ok
+= tanh downward ldbl-128 -0x8p-972L : -0x8p-972L : inexact-ok
+= tanh tonearest ldbl-128 -0x8p-972L : -0x8p-972L : inexact-ok
+= tanh towardzero ldbl-128 -0x8p-972L : -0x7.fffffffffffffffffffffffffffcp-972L : inexact-ok
+= tanh upward ldbl-128 -0x8p-972L : -0x7.fffffffffffffffffffffffffffcp-972L : inexact-ok
+= tanh downward ldbl-128ibm -0x8p-972L : -0x8p-972L : inexact-ok underflow-ok errno-erange-ok
+= tanh tonearest ldbl-128ibm -0x8p-972L : -0x8p-972L : inexact-ok underflow-ok errno-erange-ok
+= tanh towardzero ldbl-128ibm -0x8p-972L : -0x7.fffffffffffffffffffffffffcp-972L : inexact-ok underflow-ok errno-erange-ok
+= tanh upward ldbl-128ibm -0x8p-972L : -0x7.fffffffffffffffffffffffffcp-972L : inexact-ok underflow-ok errno-erange-ok
+tanh min_subnorm
+= tanh downward flt-32 0x8p-152f : 0x0p+0f : inexact-ok underflow errno-erange-ok
+= tanh tonearest flt-32 0x8p-152f : 0x8p-152f : inexact-ok underflow errno-erange-ok
+= tanh towardzero flt-32 0x8p-152f : 0x0p+0f : inexact-ok underflow errno-erange-ok
+= tanh upward flt-32 0x8p-152f : 0x8p-152f : inexact-ok underflow errno-erange-ok
+= tanh downward dbl-64 0x8p-152 : 0x7.ffffffffffffcp-152 : inexact-ok
+= tanh tonearest dbl-64 0x8p-152 : 0x8p-152 : inexact-ok
+= tanh towardzero dbl-64 0x8p-152 : 0x7.ffffffffffffcp-152 : inexact-ok
+= tanh upward dbl-64 0x8p-152 : 0x8p-152 : inexact-ok
+= tanh downward ldbl-96-intel 0x8p-152L : 0x7.fffffffffffffff8p-152L : inexact-ok
+= tanh tonearest ldbl-96-intel 0x8p-152L : 0x8p-152L : inexact-ok
+= tanh towardzero ldbl-96-intel 0x8p-152L : 0x7.fffffffffffffff8p-152L : inexact-ok
+= tanh upward ldbl-96-intel 0x8p-152L : 0x8p-152L : inexact-ok
+= tanh downward ldbl-96-m68k 0x8p-152L : 0x7.fffffffffffffff8p-152L : inexact-ok
+= tanh tonearest ldbl-96-m68k 0x8p-152L : 0x8p-152L : inexact-ok
+= tanh towardzero ldbl-96-m68k 0x8p-152L : 0x7.fffffffffffffff8p-152L : inexact-ok
+= tanh upward ldbl-96-m68k 0x8p-152L : 0x8p-152L : inexact-ok
+= tanh downward ldbl-128 0x8p-152L : 0x7.fffffffffffffffffffffffffffcp-152L : inexact-ok
+= tanh tonearest ldbl-128 0x8p-152L : 0x8p-152L : inexact-ok
+= tanh towardzero ldbl-128 0x8p-152L : 0x7.fffffffffffffffffffffffffffcp-152L : inexact-ok
+= tanh upward ldbl-128 0x8p-152L : 0x8p-152L : inexact-ok
+= tanh downward ldbl-128ibm 0x8p-152L : 0x7.fffffffffffffffffffffffffep-152L : inexact-ok
+= tanh tonearest ldbl-128ibm 0x8p-152L : 0x8p-152L : inexact-ok
+= tanh towardzero ldbl-128ibm 0x8p-152L : 0x7.fffffffffffffffffffffffffep-152L : inexact-ok
+= tanh upward ldbl-128ibm 0x8p-152L : 0x8p-152L : inexact-ok
+= tanh downward dbl-64 0x4p-1076 : 0x0p+0 : inexact-ok underflow errno-erange-ok
+= tanh tonearest dbl-64 0x4p-1076 : 0x4p-1076 : inexact-ok underflow errno-erange-ok
+= tanh towardzero dbl-64 0x4p-1076 : 0x0p+0 : inexact-ok underflow errno-erange-ok
+= tanh upward dbl-64 0x4p-1076 : 0x4p-1076 : inexact-ok underflow errno-erange-ok
+= tanh downward ldbl-96-intel 0x4p-1076L : 0x3.fffffffffffffffcp-1076L : inexact-ok
+= tanh tonearest ldbl-96-intel 0x4p-1076L : 0x4p-1076L : inexact-ok
+= tanh towardzero ldbl-96-intel 0x4p-1076L : 0x3.fffffffffffffffcp-1076L : inexact-ok
+= tanh upward ldbl-96-intel 0x4p-1076L : 0x4p-1076L : inexact-ok
+= tanh downward ldbl-96-m68k 0x4p-1076L : 0x3.fffffffffffffffcp-1076L : inexact-ok
+= tanh tonearest ldbl-96-m68k 0x4p-1076L : 0x4p-1076L : inexact-ok
+= tanh towardzero ldbl-96-m68k 0x4p-1076L : 0x3.fffffffffffffffcp-1076L : inexact-ok
+= tanh upward ldbl-96-m68k 0x4p-1076L : 0x4p-1076L : inexact-ok
+= tanh downward ldbl-128 0x4p-1076L : 0x3.fffffffffffffffffffffffffffep-1076L : inexact-ok
+= tanh tonearest ldbl-128 0x4p-1076L : 0x4p-1076L : inexact-ok
+= tanh towardzero ldbl-128 0x4p-1076L : 0x3.fffffffffffffffffffffffffffep-1076L : inexact-ok
+= tanh upward ldbl-128 0x4p-1076L : 0x4p-1076L : inexact-ok
+= tanh downward ldbl-128ibm 0x4p-1076L : 0x0p+0L : inexact-ok underflow errno-erange-ok
+= tanh tonearest ldbl-128ibm 0x4p-1076L : 0x4p-1076L : inexact-ok underflow errno-erange-ok
+= tanh towardzero ldbl-128ibm 0x4p-1076L : 0x0p+0L : inexact-ok underflow errno-erange-ok
+= tanh upward ldbl-128ibm 0x4p-1076L : 0x4p-1076L : inexact-ok underflow errno-erange-ok
+= tanh downward ldbl-96-intel 0x8p-16448L : 0x0p+0L : inexact-ok underflow errno-erange-ok
+= tanh tonearest ldbl-96-intel 0x8p-16448L : 0x8p-16448L : inexact-ok underflow errno-erange-ok
+= tanh towardzero ldbl-96-intel 0x8p-16448L : 0x0p+0L : inexact-ok underflow errno-erange-ok
+= tanh upward ldbl-96-intel 0x8p-16448L : 0x8p-16448L : inexact-ok underflow errno-erange-ok
+= tanh downward ldbl-96-m68k 0x8p-16448L : 0x4p-16448L : inexact-ok underflow errno-erange-ok
+= tanh tonearest ldbl-96-m68k 0x8p-16448L : 0x8p-16448L : inexact-ok underflow errno-erange-ok
+= tanh towardzero ldbl-96-m68k 0x8p-16448L : 0x4p-16448L : inexact-ok underflow errno-erange-ok
+= tanh upward ldbl-96-m68k 0x8p-16448L : 0x8p-16448L : inexact-ok underflow errno-erange-ok
+= tanh downward ldbl-128 0x8p-16448L : 0x7.fffffffffffcp-16448L : inexact-ok underflow errno-erange-ok
+= tanh tonearest ldbl-128 0x8p-16448L : 0x8p-16448L : inexact-ok underflow errno-erange-ok
+= tanh towardzero ldbl-128 0x8p-16448L : 0x7.fffffffffffcp-16448L : inexact-ok underflow errno-erange-ok
+= tanh upward ldbl-128 0x8p-16448L : 0x8p-16448L : inexact-ok underflow errno-erange-ok
+= tanh downward ldbl-96-m68k 0x4p-16448L : 0x0p+0L : inexact-ok underflow errno-erange-ok
+= tanh tonearest ldbl-96-m68k 0x4p-16448L : 0x4p-16448L : inexact-ok underflow errno-erange-ok
+= tanh towardzero ldbl-96-m68k 0x4p-16448L : 0x0p+0L : inexact-ok underflow errno-erange-ok
+= tanh upward ldbl-96-m68k 0x4p-16448L : 0x4p-16448L : inexact-ok underflow errno-erange-ok
+= tanh downward ldbl-128 0x4p-16448L : 0x3.fffffffffffcp-16448L : inexact-ok underflow errno-erange-ok
+= tanh tonearest ldbl-128 0x4p-16448L : 0x4p-16448L : inexact-ok underflow errno-erange-ok
+= tanh towardzero ldbl-128 0x4p-16448L : 0x3.fffffffffffcp-16448L : inexact-ok underflow errno-erange-ok
+= tanh upward ldbl-128 0x4p-16448L : 0x4p-16448L : inexact-ok underflow errno-erange-ok
+= tanh downward ldbl-128 0x4p-16496L : 0x0p+0L : inexact-ok underflow errno-erange-ok
+= tanh tonearest ldbl-128 0x4p-16496L : 0x4p-16496L : inexact-ok underflow errno-erange-ok
+= tanh towardzero ldbl-128 0x4p-16496L : 0x0p+0L : inexact-ok underflow errno-erange-ok
+= tanh upward ldbl-128 0x4p-16496L : 0x4p-16496L : inexact-ok underflow errno-erange-ok
+tanh -min_subnorm
+= tanh downward flt-32 -0x8p-152f : -0x8p-152f : inexact-ok underflow errno-erange-ok
+= tanh tonearest flt-32 -0x8p-152f : -0x8p-152f : inexact-ok underflow errno-erange-ok
+= tanh towardzero flt-32 -0x8p-152f : -0x0p+0f : inexact-ok underflow errno-erange-ok
+= tanh upward flt-32 -0x8p-152f : -0x0p+0f : inexact-ok underflow errno-erange-ok
+= tanh downward dbl-64 -0x8p-152 : -0x8p-152 : inexact-ok
+= tanh tonearest dbl-64 -0x8p-152 : -0x8p-152 : inexact-ok
+= tanh towardzero dbl-64 -0x8p-152 : -0x7.ffffffffffffcp-152 : inexact-ok
+= tanh upward dbl-64 -0x8p-152 : -0x7.ffffffffffffcp-152 : inexact-ok
+= tanh downward ldbl-96-intel -0x8p-152L : -0x8p-152L : inexact-ok
+= tanh tonearest ldbl-96-intel -0x8p-152L : -0x8p-152L : inexact-ok
+= tanh towardzero ldbl-96-intel -0x8p-152L : -0x7.fffffffffffffff8p-152L : inexact-ok
+= tanh upward ldbl-96-intel -0x8p-152L : -0x7.fffffffffffffff8p-152L : inexact-ok
+= tanh downward ldbl-96-m68k -0x8p-152L : -0x8p-152L : inexact-ok
+= tanh tonearest ldbl-96-m68k -0x8p-152L : -0x8p-152L : inexact-ok
+= tanh towardzero ldbl-96-m68k -0x8p-152L : -0x7.fffffffffffffff8p-152L : inexact-ok
+= tanh upward ldbl-96-m68k -0x8p-152L : -0x7.fffffffffffffff8p-152L : inexact-ok
+= tanh downward ldbl-128 -0x8p-152L : -0x8p-152L : inexact-ok
+= tanh tonearest ldbl-128 -0x8p-152L : -0x8p-152L : inexact-ok
+= tanh towardzero ldbl-128 -0x8p-152L : -0x7.fffffffffffffffffffffffffffcp-152L : inexact-ok
+= tanh upward ldbl-128 -0x8p-152L : -0x7.fffffffffffffffffffffffffffcp-152L : inexact-ok
+= tanh downward ldbl-128ibm -0x8p-152L : -0x8p-152L : inexact-ok
+= tanh tonearest ldbl-128ibm -0x8p-152L : -0x8p-152L : inexact-ok
+= tanh towardzero ldbl-128ibm -0x8p-152L : -0x7.fffffffffffffffffffffffffep-152L : inexact-ok
+= tanh upward ldbl-128ibm -0x8p-152L : -0x7.fffffffffffffffffffffffffep-152L : inexact-ok
+= tanh downward dbl-64 -0x4p-1076 : -0x4p-1076 : inexact-ok underflow errno-erange-ok
+= tanh tonearest dbl-64 -0x4p-1076 : -0x4p-1076 : inexact-ok underflow errno-erange-ok
+= tanh towardzero dbl-64 -0x4p-1076 : -0x0p+0 : inexact-ok underflow errno-erange-ok
+= tanh upward dbl-64 -0x4p-1076 : -0x0p+0 : inexact-ok underflow errno-erange-ok
+= tanh downward ldbl-96-intel -0x4p-1076L : -0x4p-1076L : inexact-ok
+= tanh tonearest ldbl-96-intel -0x4p-1076L : -0x4p-1076L : inexact-ok
+= tanh towardzero ldbl-96-intel -0x4p-1076L : -0x3.fffffffffffffffcp-1076L : inexact-ok
+= tanh upward ldbl-96-intel -0x4p-1076L : -0x3.fffffffffffffffcp-1076L : inexact-ok
+= tanh downward ldbl-96-m68k -0x4p-1076L : -0x4p-1076L : inexact-ok
+= tanh tonearest ldbl-96-m68k -0x4p-1076L : -0x4p-1076L : inexact-ok
+= tanh towardzero ldbl-96-m68k -0x4p-1076L : -0x3.fffffffffffffffcp-1076L : inexact-ok
+= tanh upward ldbl-96-m68k -0x4p-1076L : -0x3.fffffffffffffffcp-1076L : inexact-ok
+= tanh downward ldbl-128 -0x4p-1076L : -0x4p-1076L : inexact-ok
+= tanh tonearest ldbl-128 -0x4p-1076L : -0x4p-1076L : inexact-ok
+= tanh towardzero ldbl-128 -0x4p-1076L : -0x3.fffffffffffffffffffffffffffep-1076L : inexact-ok
+= tanh upward ldbl-128 -0x4p-1076L : -0x3.fffffffffffffffffffffffffffep-1076L : inexact-ok
+= tanh downward ldbl-128ibm -0x4p-1076L : -0x4p-1076L : inexact-ok underflow errno-erange-ok
+= tanh tonearest ldbl-128ibm -0x4p-1076L : -0x4p-1076L : inexact-ok underflow errno-erange-ok
+= tanh towardzero ldbl-128ibm -0x4p-1076L : -0x0p+0L : inexact-ok underflow errno-erange-ok
+= tanh upward ldbl-128ibm -0x4p-1076L : -0x0p+0L : inexact-ok underflow errno-erange-ok
+= tanh downward ldbl-96-intel -0x8p-16448L : -0x8p-16448L : inexact-ok underflow errno-erange-ok
+= tanh tonearest ldbl-96-intel -0x8p-16448L : -0x8p-16448L : inexact-ok underflow errno-erange-ok
+= tanh towardzero ldbl-96-intel -0x8p-16448L : -0x0p+0L : inexact-ok underflow errno-erange-ok
+= tanh upward ldbl-96-intel -0x8p-16448L : -0x0p+0L : inexact-ok underflow errno-erange-ok
+= tanh downward ldbl-96-m68k -0x8p-16448L : -0x8p-16448L : inexact-ok underflow errno-erange-ok
+= tanh tonearest ldbl-96-m68k -0x8p-16448L : -0x8p-16448L : inexact-ok underflow errno-erange-ok
+= tanh towardzero ldbl-96-m68k -0x8p-16448L : -0x4p-16448L : inexact-ok underflow errno-erange-ok
+= tanh upward ldbl-96-m68k -0x8p-16448L : -0x4p-16448L : inexact-ok underflow errno-erange-ok
+= tanh downward ldbl-128 -0x8p-16448L : -0x8p-16448L : inexact-ok underflow errno-erange-ok
+= tanh tonearest ldbl-128 -0x8p-16448L : -0x8p-16448L : inexact-ok underflow errno-erange-ok
+= tanh towardzero ldbl-128 -0x8p-16448L : -0x7.fffffffffffcp-16448L : inexact-ok underflow errno-erange-ok
+= tanh upward ldbl-128 -0x8p-16448L : -0x7.fffffffffffcp-16448L : inexact-ok underflow errno-erange-ok
+= tanh downward ldbl-96-m68k -0x4p-16448L : -0x4p-16448L : inexact-ok underflow errno-erange-ok
+= tanh tonearest ldbl-96-m68k -0x4p-16448L : -0x4p-16448L : inexact-ok underflow errno-erange-ok
+= tanh towardzero ldbl-96-m68k -0x4p-16448L : -0x0p+0L : inexact-ok underflow errno-erange-ok
+= tanh upward ldbl-96-m68k -0x4p-16448L : -0x0p+0L : inexact-ok underflow errno-erange-ok
+= tanh downward ldbl-128 -0x4p-16448L : -0x4p-16448L : inexact-ok underflow errno-erange-ok
+= tanh tonearest ldbl-128 -0x4p-16448L : -0x4p-16448L : inexact-ok underflow errno-erange-ok
+= tanh towardzero ldbl-128 -0x4p-16448L : -0x3.fffffffffffcp-16448L : inexact-ok underflow errno-erange-ok
+= tanh upward ldbl-128 -0x4p-16448L : -0x3.fffffffffffcp-16448L : inexact-ok underflow errno-erange-ok
+= tanh downward ldbl-128 -0x4p-16496L : -0x4p-16496L : inexact-ok underflow errno-erange-ok
+= tanh tonearest ldbl-128 -0x4p-16496L : -0x4p-16496L : inexact-ok underflow errno-erange-ok
+= tanh towardzero ldbl-128 -0x4p-16496L : -0x0p+0L : inexact-ok underflow errno-erange-ok
+= tanh upward ldbl-128 -0x4p-16496L : -0x0p+0L : inexact-ok underflow errno-erange-ok
 tgamma 0.5
 = tgamma downward flt-32 0x8p-4f : 0x1.c5bf88p+0f : inexact-ok
 = tgamma tonearest flt-32 0x8p-4f : 0x1.c5bf8ap+0f : inexact-ok
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);