about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog21
-rw-r--r--NEWS2
-rw-r--r--math/auto-libm-test-in4
-rw-r--r--math/auto-libm-test-out316
-rw-r--r--sysdeps/ieee754/dbl-64/s_tan.c6
-rw-r--r--sysdeps/ieee754/flt-32/k_tanf.c13
-rw-r--r--sysdeps/ieee754/ldbl-128/k_tanl.c12
-rw-r--r--sysdeps/ieee754/ldbl-128ibm/k_tanl.c12
-rw-r--r--sysdeps/ieee754/ldbl-96/k_tanl.c12
9 files changed, 393 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index ac1383427d..473ed336ae 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,24 @@
+2015-08-07  Joseph Myers  <joseph@codesourcery.com>
+
+	[BZ #16517]
+	* sysdeps/ieee754/dbl-64/s_tan.c: Include <float.h>.
+	(tan): Force underflow exception for arguments with small absolute
+	value.
+	* sysdeps/ieee754/flt-32/k_tanf.c: Include <float.h>.
+	(__kernel_tanf): Force underflow exception for arguments with
+	small absolute value.
+	* sysdeps/ieee754/ldbl-128/k_tanl.c: Include <float.h>.
+	(__kernel_tanl): Force underflow exception for arguments with
+	small absolute value.
+	* sysdeps/ieee754/ldbl-128ibm/k_tanl.c: Include <float.h>.
+	(__kernel_tanl): Force underflow exception for arguments with
+	small absolute value.
+	* sysdeps/ieee754/ldbl-96/k_tanl.c: Include <float.h>.
+	(__kernel_tanl): Force underflow exception for arguments with
+	small absolute value.
+	* math/auto-libm-test-in: Add more tests of tan.
+	* math/auto-libm-test-out: Regenerated.
+
 2015-08-07  Samuel Thibault  <samuel.thibault@ens-lyon.org>
 
 	Fix sysdeps/i386/fpu/s_scalbn.S build
diff --git a/NEWS b/NEWS
index bb45b92ecf..bb4a4c24c6 100644
--- a/NEWS
+++ b/NEWS
@@ -8,7 +8,7 @@ using `glibc' in the "product" field.
 Version 2.23
 
 * The following bugs are resolved with this release:
-  16519, 18265, 18525, 18618, 18647, 18661.
+  16517, 16519, 18265, 18525, 18618, 18647, 18661.
 
 Version 2.22
 
diff --git a/math/auto-libm-test-in b/math/auto-libm-test-in
index cc9b7fd318..bb6d30e6f5 100644
--- a/math/auto-libm-test-in
+++ b/math/auto-libm-test-in
@@ -2659,6 +2659,10 @@ tan 9
 tan 10
 tan -0x1.062a48p+0
 tan -0x1.4f69cp+0
+tan min
+tan -min
+tan min_subnorm
+tan -min_subnorm
 
 tanh 0
 tanh -0
diff --git a/math/auto-libm-test-out b/math/auto-libm-test-out
index 81abc0cf4d..a31039419d 100644
--- a/math/auto-libm-test-out
+++ b/math/auto-libm-test-out
@@ -201183,6 +201183,322 @@ tan -0x1.4f69cp+0
 = tan tonearest ldbl-128ibm -0x1.4f69cp+0L : -0x3.c00d4280aa7bede62d35d88621p+0L : inexact-ok
 = tan towardzero ldbl-128ibm -0x1.4f69cp+0L : -0x3.c00d4280aa7bede62d35d8862p+0L : inexact-ok
 = tan upward ldbl-128ibm -0x1.4f69cp+0L : -0x3.c00d4280aa7bede62d35d8862p+0L : inexact-ok
+tan min
+= tan downward flt-32 0x4p-128f : 0x4p-128f : inexact-ok underflow-ok errno-erange-ok
+= tan tonearest flt-32 0x4p-128f : 0x4p-128f : inexact-ok underflow-ok errno-erange-ok
+= tan towardzero flt-32 0x4p-128f : 0x4p-128f : inexact-ok underflow-ok errno-erange-ok
+= tan upward flt-32 0x4p-128f : 0x4.000008p-128f : inexact-ok underflow-ok errno-erange-ok
+= tan downward dbl-64 0x4p-128 : 0x4p-128 : inexact-ok
+= tan tonearest dbl-64 0x4p-128 : 0x4p-128 : inexact-ok
+= tan towardzero dbl-64 0x4p-128 : 0x4p-128 : inexact-ok
+= tan upward dbl-64 0x4p-128 : 0x4.0000000000004p-128 : inexact-ok
+= tan downward ldbl-96-intel 0x4p-128L : 0x4p-128L : inexact-ok
+= tan tonearest ldbl-96-intel 0x4p-128L : 0x4p-128L : inexact-ok
+= tan towardzero ldbl-96-intel 0x4p-128L : 0x4p-128L : inexact-ok
+= tan upward ldbl-96-intel 0x4p-128L : 0x4.0000000000000008p-128L : inexact-ok
+= tan downward ldbl-96-m68k 0x4p-128L : 0x4p-128L : inexact-ok
+= tan tonearest ldbl-96-m68k 0x4p-128L : 0x4p-128L : inexact-ok
+= tan towardzero ldbl-96-m68k 0x4p-128L : 0x4p-128L : inexact-ok
+= tan upward ldbl-96-m68k 0x4p-128L : 0x4.0000000000000008p-128L : inexact-ok
+= tan downward ldbl-128 0x4p-128L : 0x4p-128L : inexact-ok
+= tan tonearest ldbl-128 0x4p-128L : 0x4p-128L : inexact-ok
+= tan towardzero ldbl-128 0x4p-128L : 0x4p-128L : inexact-ok
+= tan upward ldbl-128 0x4p-128L : 0x4.0000000000000000000000000004p-128L : inexact-ok
+= tan downward ldbl-128ibm 0x4p-128L : 0x4p-128L : inexact-ok
+= tan tonearest ldbl-128ibm 0x4p-128L : 0x4p-128L : inexact-ok
+= tan towardzero ldbl-128ibm 0x4p-128L : 0x4p-128L : inexact-ok
+= tan upward ldbl-128ibm 0x4p-128L : 0x4.00000000000000000000000002p-128L : inexact-ok
+= tan downward dbl-64 0x4p-1024 : 0x4p-1024 : inexact-ok underflow-ok errno-erange-ok
+= tan tonearest dbl-64 0x4p-1024 : 0x4p-1024 : inexact-ok underflow-ok errno-erange-ok
+= tan towardzero dbl-64 0x4p-1024 : 0x4p-1024 : inexact-ok underflow-ok errno-erange-ok
+= tan upward dbl-64 0x4p-1024 : 0x4.0000000000004p-1024 : inexact-ok underflow-ok errno-erange-ok
+= tan downward ldbl-96-intel 0x4p-1024L : 0x4p-1024L : inexact-ok
+= tan tonearest ldbl-96-intel 0x4p-1024L : 0x4p-1024L : inexact-ok
+= tan towardzero ldbl-96-intel 0x4p-1024L : 0x4p-1024L : inexact-ok
+= tan upward ldbl-96-intel 0x4p-1024L : 0x4.0000000000000008p-1024L : inexact-ok
+= tan downward ldbl-96-m68k 0x4p-1024L : 0x4p-1024L : inexact-ok
+= tan tonearest ldbl-96-m68k 0x4p-1024L : 0x4p-1024L : inexact-ok
+= tan towardzero ldbl-96-m68k 0x4p-1024L : 0x4p-1024L : inexact-ok
+= tan upward ldbl-96-m68k 0x4p-1024L : 0x4.0000000000000008p-1024L : inexact-ok
+= tan downward ldbl-128 0x4p-1024L : 0x4p-1024L : inexact-ok
+= tan tonearest ldbl-128 0x4p-1024L : 0x4p-1024L : inexact-ok
+= tan towardzero ldbl-128 0x4p-1024L : 0x4p-1024L : inexact-ok
+= tan upward ldbl-128 0x4p-1024L : 0x4.0000000000000000000000000004p-1024L : inexact-ok
+= tan downward ldbl-128ibm 0x4p-1024L : 0x4p-1024L : inexact-ok underflow errno-erange-ok
+= tan tonearest ldbl-128ibm 0x4p-1024L : 0x4p-1024L : inexact-ok underflow errno-erange-ok
+= tan towardzero ldbl-128ibm 0x4p-1024L : 0x4p-1024L : inexact-ok underflow errno-erange-ok
+= tan upward ldbl-128ibm 0x4p-1024L : 0x4.0000000000004p-1024L : inexact-ok underflow errno-erange-ok
+= tan downward ldbl-96-intel 0x4p-16384L : 0x4p-16384L : inexact-ok underflow-ok errno-erange-ok
+= tan tonearest ldbl-96-intel 0x4p-16384L : 0x4p-16384L : inexact-ok underflow-ok errno-erange-ok
+= tan towardzero ldbl-96-intel 0x4p-16384L : 0x4p-16384L : inexact-ok underflow-ok errno-erange-ok
+= tan upward ldbl-96-intel 0x4p-16384L : 0x4.0000000000000008p-16384L : inexact-ok underflow-ok errno-erange-ok
+= tan downward ldbl-96-m68k 0x4p-16384L : 0x4p-16384L : inexact-ok
+= tan tonearest ldbl-96-m68k 0x4p-16384L : 0x4p-16384L : inexact-ok
+= tan towardzero ldbl-96-m68k 0x4p-16384L : 0x4p-16384L : inexact-ok
+= tan upward ldbl-96-m68k 0x4p-16384L : 0x4.0000000000000008p-16384L : inexact-ok
+= tan downward ldbl-128 0x4p-16384L : 0x4p-16384L : inexact-ok underflow-ok errno-erange-ok
+= tan tonearest ldbl-128 0x4p-16384L : 0x4p-16384L : inexact-ok underflow-ok errno-erange-ok
+= tan towardzero ldbl-128 0x4p-16384L : 0x4p-16384L : inexact-ok underflow-ok errno-erange-ok
+= tan upward ldbl-128 0x4p-16384L : 0x4.0000000000000000000000000004p-16384L : inexact-ok underflow-ok errno-erange-ok
+= tan downward ldbl-96-intel 0x2p-16384L : 0x2p-16384L : inexact-ok underflow errno-erange-ok
+= tan tonearest ldbl-96-intel 0x2p-16384L : 0x2p-16384L : inexact-ok underflow errno-erange-ok
+= tan towardzero ldbl-96-intel 0x2p-16384L : 0x2p-16384L : inexact-ok underflow errno-erange-ok
+= tan upward ldbl-96-intel 0x2p-16384L : 0x2.0000000000000008p-16384L : inexact-ok underflow errno-erange-ok
+= tan downward ldbl-96-m68k 0x2p-16384L : 0x2p-16384L : inexact-ok underflow-ok errno-erange-ok
+= tan tonearest ldbl-96-m68k 0x2p-16384L : 0x2p-16384L : inexact-ok underflow-ok errno-erange-ok
+= tan towardzero ldbl-96-m68k 0x2p-16384L : 0x2p-16384L : inexact-ok underflow-ok errno-erange-ok
+= tan upward ldbl-96-m68k 0x2p-16384L : 0x2.0000000000000004p-16384L : inexact-ok underflow-ok errno-erange-ok
+= tan downward ldbl-128 0x2p-16384L : 0x2p-16384L : inexact-ok underflow errno-erange-ok
+= tan tonearest ldbl-128 0x2p-16384L : 0x2p-16384L : inexact-ok underflow errno-erange-ok
+= tan towardzero ldbl-128 0x2p-16384L : 0x2p-16384L : inexact-ok underflow errno-erange-ok
+= tan upward ldbl-128 0x2p-16384L : 0x2.0000000000000000000000000004p-16384L : inexact-ok underflow errno-erange-ok
+= tan downward dbl-64 0x8p-972 : 0x8p-972 : inexact-ok
+= tan tonearest dbl-64 0x8p-972 : 0x8p-972 : inexact-ok
+= tan towardzero dbl-64 0x8p-972 : 0x8p-972 : inexact-ok
+= tan upward dbl-64 0x8p-972 : 0x8.0000000000008p-972 : inexact-ok
+= tan downward ldbl-96-intel 0x8p-972L : 0x8p-972L : inexact-ok
+= tan tonearest ldbl-96-intel 0x8p-972L : 0x8p-972L : inexact-ok
+= tan towardzero ldbl-96-intel 0x8p-972L : 0x8p-972L : inexact-ok
+= tan upward ldbl-96-intel 0x8p-972L : 0x8.000000000000001p-972L : inexact-ok
+= tan downward ldbl-96-m68k 0x8p-972L : 0x8p-972L : inexact-ok
+= tan tonearest ldbl-96-m68k 0x8p-972L : 0x8p-972L : inexact-ok
+= tan towardzero ldbl-96-m68k 0x8p-972L : 0x8p-972L : inexact-ok
+= tan upward ldbl-96-m68k 0x8p-972L : 0x8.000000000000001p-972L : inexact-ok
+= tan downward ldbl-128 0x8p-972L : 0x8p-972L : inexact-ok
+= tan tonearest ldbl-128 0x8p-972L : 0x8p-972L : inexact-ok
+= tan towardzero ldbl-128 0x8p-972L : 0x8p-972L : inexact-ok
+= tan upward ldbl-128 0x8p-972L : 0x8.0000000000000000000000000008p-972L : inexact-ok
+= tan downward ldbl-128ibm 0x8p-972L : 0x8p-972L : inexact-ok underflow-ok errno-erange-ok
+= tan tonearest ldbl-128ibm 0x8p-972L : 0x8p-972L : inexact-ok underflow-ok errno-erange-ok
+= tan towardzero ldbl-128ibm 0x8p-972L : 0x8p-972L : inexact-ok underflow-ok errno-erange-ok
+= tan upward ldbl-128ibm 0x8p-972L : 0x8.00000000000000000000000004p-972L : inexact-ok underflow-ok errno-erange-ok
+tan -min
+= tan downward flt-32 -0x4p-128f : -0x4.000008p-128f : inexact-ok underflow-ok errno-erange-ok
+= tan tonearest flt-32 -0x4p-128f : -0x4p-128f : inexact-ok underflow-ok errno-erange-ok
+= tan towardzero flt-32 -0x4p-128f : -0x4p-128f : inexact-ok underflow-ok errno-erange-ok
+= tan upward flt-32 -0x4p-128f : -0x4p-128f : inexact-ok underflow-ok errno-erange-ok
+= tan downward dbl-64 -0x4p-128 : -0x4.0000000000004p-128 : inexact-ok
+= tan tonearest dbl-64 -0x4p-128 : -0x4p-128 : inexact-ok
+= tan towardzero dbl-64 -0x4p-128 : -0x4p-128 : inexact-ok
+= tan upward dbl-64 -0x4p-128 : -0x4p-128 : inexact-ok
+= tan downward ldbl-96-intel -0x4p-128L : -0x4.0000000000000008p-128L : inexact-ok
+= tan tonearest ldbl-96-intel -0x4p-128L : -0x4p-128L : inexact-ok
+= tan towardzero ldbl-96-intel -0x4p-128L : -0x4p-128L : inexact-ok
+= tan upward ldbl-96-intel -0x4p-128L : -0x4p-128L : inexact-ok
+= tan downward ldbl-96-m68k -0x4p-128L : -0x4.0000000000000008p-128L : inexact-ok
+= tan tonearest ldbl-96-m68k -0x4p-128L : -0x4p-128L : inexact-ok
+= tan towardzero ldbl-96-m68k -0x4p-128L : -0x4p-128L : inexact-ok
+= tan upward ldbl-96-m68k -0x4p-128L : -0x4p-128L : inexact-ok
+= tan downward ldbl-128 -0x4p-128L : -0x4.0000000000000000000000000004p-128L : inexact-ok
+= tan tonearest ldbl-128 -0x4p-128L : -0x4p-128L : inexact-ok
+= tan towardzero ldbl-128 -0x4p-128L : -0x4p-128L : inexact-ok
+= tan upward ldbl-128 -0x4p-128L : -0x4p-128L : inexact-ok
+= tan downward ldbl-128ibm -0x4p-128L : -0x4.00000000000000000000000002p-128L : inexact-ok
+= tan tonearest ldbl-128ibm -0x4p-128L : -0x4p-128L : inexact-ok
+= tan towardzero ldbl-128ibm -0x4p-128L : -0x4p-128L : inexact-ok
+= tan upward ldbl-128ibm -0x4p-128L : -0x4p-128L : inexact-ok
+= tan downward dbl-64 -0x4p-1024 : -0x4.0000000000004p-1024 : inexact-ok underflow-ok errno-erange-ok
+= tan tonearest dbl-64 -0x4p-1024 : -0x4p-1024 : inexact-ok underflow-ok errno-erange-ok
+= tan towardzero dbl-64 -0x4p-1024 : -0x4p-1024 : inexact-ok underflow-ok errno-erange-ok
+= tan upward dbl-64 -0x4p-1024 : -0x4p-1024 : inexact-ok underflow-ok errno-erange-ok
+= tan downward ldbl-96-intel -0x4p-1024L : -0x4.0000000000000008p-1024L : inexact-ok
+= tan tonearest ldbl-96-intel -0x4p-1024L : -0x4p-1024L : inexact-ok
+= tan towardzero ldbl-96-intel -0x4p-1024L : -0x4p-1024L : inexact-ok
+= tan upward ldbl-96-intel -0x4p-1024L : -0x4p-1024L : inexact-ok
+= tan downward ldbl-96-m68k -0x4p-1024L : -0x4.0000000000000008p-1024L : inexact-ok
+= tan tonearest ldbl-96-m68k -0x4p-1024L : -0x4p-1024L : inexact-ok
+= tan towardzero ldbl-96-m68k -0x4p-1024L : -0x4p-1024L : inexact-ok
+= tan upward ldbl-96-m68k -0x4p-1024L : -0x4p-1024L : inexact-ok
+= tan downward ldbl-128 -0x4p-1024L : -0x4.0000000000000000000000000004p-1024L : inexact-ok
+= tan tonearest ldbl-128 -0x4p-1024L : -0x4p-1024L : inexact-ok
+= tan towardzero ldbl-128 -0x4p-1024L : -0x4p-1024L : inexact-ok
+= tan upward ldbl-128 -0x4p-1024L : -0x4p-1024L : inexact-ok
+= tan downward ldbl-128ibm -0x4p-1024L : -0x4.0000000000004p-1024L : inexact-ok underflow errno-erange-ok
+= tan tonearest ldbl-128ibm -0x4p-1024L : -0x4p-1024L : inexact-ok underflow errno-erange-ok
+= tan towardzero ldbl-128ibm -0x4p-1024L : -0x4p-1024L : inexact-ok underflow errno-erange-ok
+= tan upward ldbl-128ibm -0x4p-1024L : -0x4p-1024L : inexact-ok underflow errno-erange-ok
+= tan downward ldbl-96-intel -0x4p-16384L : -0x4.0000000000000008p-16384L : inexact-ok underflow-ok errno-erange-ok
+= tan tonearest ldbl-96-intel -0x4p-16384L : -0x4p-16384L : inexact-ok underflow-ok errno-erange-ok
+= tan towardzero ldbl-96-intel -0x4p-16384L : -0x4p-16384L : inexact-ok underflow-ok errno-erange-ok
+= tan upward ldbl-96-intel -0x4p-16384L : -0x4p-16384L : inexact-ok underflow-ok errno-erange-ok
+= tan downward ldbl-96-m68k -0x4p-16384L : -0x4.0000000000000008p-16384L : inexact-ok
+= tan tonearest ldbl-96-m68k -0x4p-16384L : -0x4p-16384L : inexact-ok
+= tan towardzero ldbl-96-m68k -0x4p-16384L : -0x4p-16384L : inexact-ok
+= tan upward ldbl-96-m68k -0x4p-16384L : -0x4p-16384L : inexact-ok
+= tan downward ldbl-128 -0x4p-16384L : -0x4.0000000000000000000000000004p-16384L : inexact-ok underflow-ok errno-erange-ok
+= tan tonearest ldbl-128 -0x4p-16384L : -0x4p-16384L : inexact-ok underflow-ok errno-erange-ok
+= tan towardzero ldbl-128 -0x4p-16384L : -0x4p-16384L : inexact-ok underflow-ok errno-erange-ok
+= tan upward ldbl-128 -0x4p-16384L : -0x4p-16384L : inexact-ok underflow-ok errno-erange-ok
+= tan downward ldbl-96-intel -0x2p-16384L : -0x2.0000000000000008p-16384L : inexact-ok underflow errno-erange-ok
+= tan tonearest ldbl-96-intel -0x2p-16384L : -0x2p-16384L : inexact-ok underflow errno-erange-ok
+= tan towardzero ldbl-96-intel -0x2p-16384L : -0x2p-16384L : inexact-ok underflow errno-erange-ok
+= tan upward ldbl-96-intel -0x2p-16384L : -0x2p-16384L : inexact-ok underflow errno-erange-ok
+= tan downward ldbl-96-m68k -0x2p-16384L : -0x2.0000000000000004p-16384L : inexact-ok underflow-ok errno-erange-ok
+= tan tonearest ldbl-96-m68k -0x2p-16384L : -0x2p-16384L : inexact-ok underflow-ok errno-erange-ok
+= tan towardzero ldbl-96-m68k -0x2p-16384L : -0x2p-16384L : inexact-ok underflow-ok errno-erange-ok
+= tan upward ldbl-96-m68k -0x2p-16384L : -0x2p-16384L : inexact-ok underflow-ok errno-erange-ok
+= tan downward ldbl-128 -0x2p-16384L : -0x2.0000000000000000000000000004p-16384L : inexact-ok underflow errno-erange-ok
+= tan tonearest ldbl-128 -0x2p-16384L : -0x2p-16384L : inexact-ok underflow errno-erange-ok
+= tan towardzero ldbl-128 -0x2p-16384L : -0x2p-16384L : inexact-ok underflow errno-erange-ok
+= tan upward ldbl-128 -0x2p-16384L : -0x2p-16384L : inexact-ok underflow errno-erange-ok
+= tan downward dbl-64 -0x8p-972 : -0x8.0000000000008p-972 : inexact-ok
+= tan tonearest dbl-64 -0x8p-972 : -0x8p-972 : inexact-ok
+= tan towardzero dbl-64 -0x8p-972 : -0x8p-972 : inexact-ok
+= tan upward dbl-64 -0x8p-972 : -0x8p-972 : inexact-ok
+= tan downward ldbl-96-intel -0x8p-972L : -0x8.000000000000001p-972L : inexact-ok
+= tan tonearest ldbl-96-intel -0x8p-972L : -0x8p-972L : inexact-ok
+= tan towardzero ldbl-96-intel -0x8p-972L : -0x8p-972L : inexact-ok
+= tan upward ldbl-96-intel -0x8p-972L : -0x8p-972L : inexact-ok
+= tan downward ldbl-96-m68k -0x8p-972L : -0x8.000000000000001p-972L : inexact-ok
+= tan tonearest ldbl-96-m68k -0x8p-972L : -0x8p-972L : inexact-ok
+= tan towardzero ldbl-96-m68k -0x8p-972L : -0x8p-972L : inexact-ok
+= tan upward ldbl-96-m68k -0x8p-972L : -0x8p-972L : inexact-ok
+= tan downward ldbl-128 -0x8p-972L : -0x8.0000000000000000000000000008p-972L : inexact-ok
+= tan tonearest ldbl-128 -0x8p-972L : -0x8p-972L : inexact-ok
+= tan towardzero ldbl-128 -0x8p-972L : -0x8p-972L : inexact-ok
+= tan upward ldbl-128 -0x8p-972L : -0x8p-972L : inexact-ok
+= tan downward ldbl-128ibm -0x8p-972L : -0x8.00000000000000000000000004p-972L : inexact-ok underflow-ok errno-erange-ok
+= tan tonearest ldbl-128ibm -0x8p-972L : -0x8p-972L : inexact-ok underflow-ok errno-erange-ok
+= tan towardzero ldbl-128ibm -0x8p-972L : -0x8p-972L : inexact-ok underflow-ok errno-erange-ok
+= tan upward ldbl-128ibm -0x8p-972L : -0x8p-972L : inexact-ok underflow-ok errno-erange-ok
+tan min_subnorm
+= tan downward flt-32 0x8p-152f : 0x8p-152f : inexact-ok underflow errno-erange-ok
+= tan tonearest flt-32 0x8p-152f : 0x8p-152f : inexact-ok underflow errno-erange-ok
+= tan towardzero flt-32 0x8p-152f : 0x8p-152f : inexact-ok underflow errno-erange-ok
+= tan upward flt-32 0x8p-152f : 0x1p-148f : inexact-ok underflow errno-erange-ok
+= tan downward dbl-64 0x8p-152 : 0x8p-152 : inexact-ok
+= tan tonearest dbl-64 0x8p-152 : 0x8p-152 : inexact-ok
+= tan towardzero dbl-64 0x8p-152 : 0x8p-152 : inexact-ok
+= tan upward dbl-64 0x8p-152 : 0x8.0000000000008p-152 : inexact-ok
+= tan downward ldbl-96-intel 0x8p-152L : 0x8p-152L : inexact-ok
+= tan tonearest ldbl-96-intel 0x8p-152L : 0x8p-152L : inexact-ok
+= tan towardzero ldbl-96-intel 0x8p-152L : 0x8p-152L : inexact-ok
+= tan upward ldbl-96-intel 0x8p-152L : 0x8.000000000000001p-152L : inexact-ok
+= tan downward ldbl-96-m68k 0x8p-152L : 0x8p-152L : inexact-ok
+= tan tonearest ldbl-96-m68k 0x8p-152L : 0x8p-152L : inexact-ok
+= tan towardzero ldbl-96-m68k 0x8p-152L : 0x8p-152L : inexact-ok
+= tan upward ldbl-96-m68k 0x8p-152L : 0x8.000000000000001p-152L : inexact-ok
+= tan downward ldbl-128 0x8p-152L : 0x8p-152L : inexact-ok
+= tan tonearest ldbl-128 0x8p-152L : 0x8p-152L : inexact-ok
+= tan towardzero ldbl-128 0x8p-152L : 0x8p-152L : inexact-ok
+= tan upward ldbl-128 0x8p-152L : 0x8.0000000000000000000000000008p-152L : inexact-ok
+= tan downward ldbl-128ibm 0x8p-152L : 0x8p-152L : inexact-ok
+= tan tonearest ldbl-128ibm 0x8p-152L : 0x8p-152L : inexact-ok
+= tan towardzero ldbl-128ibm 0x8p-152L : 0x8p-152L : inexact-ok
+= tan upward ldbl-128ibm 0x8p-152L : 0x8.00000000000000000000000004p-152L : inexact-ok
+= tan downward dbl-64 0x4p-1076 : 0x4p-1076 : inexact-ok underflow errno-erange-ok
+= tan tonearest dbl-64 0x4p-1076 : 0x4p-1076 : inexact-ok underflow errno-erange-ok
+= tan towardzero dbl-64 0x4p-1076 : 0x4p-1076 : inexact-ok underflow errno-erange-ok
+= tan upward dbl-64 0x4p-1076 : 0x8p-1076 : inexact-ok underflow errno-erange-ok
+= tan downward ldbl-96-intel 0x4p-1076L : 0x4p-1076L : inexact-ok
+= tan tonearest ldbl-96-intel 0x4p-1076L : 0x4p-1076L : inexact-ok
+= tan towardzero ldbl-96-intel 0x4p-1076L : 0x4p-1076L : inexact-ok
+= tan upward ldbl-96-intel 0x4p-1076L : 0x4.0000000000000008p-1076L : inexact-ok
+= tan downward ldbl-96-m68k 0x4p-1076L : 0x4p-1076L : inexact-ok
+= tan tonearest ldbl-96-m68k 0x4p-1076L : 0x4p-1076L : inexact-ok
+= tan towardzero ldbl-96-m68k 0x4p-1076L : 0x4p-1076L : inexact-ok
+= tan upward ldbl-96-m68k 0x4p-1076L : 0x4.0000000000000008p-1076L : inexact-ok
+= tan downward ldbl-128 0x4p-1076L : 0x4p-1076L : inexact-ok
+= tan tonearest ldbl-128 0x4p-1076L : 0x4p-1076L : inexact-ok
+= tan towardzero ldbl-128 0x4p-1076L : 0x4p-1076L : inexact-ok
+= tan upward ldbl-128 0x4p-1076L : 0x4.0000000000000000000000000004p-1076L : inexact-ok
+= tan downward ldbl-128ibm 0x4p-1076L : 0x4p-1076L : inexact-ok underflow errno-erange-ok
+= tan tonearest ldbl-128ibm 0x4p-1076L : 0x4p-1076L : inexact-ok underflow errno-erange-ok
+= tan towardzero ldbl-128ibm 0x4p-1076L : 0x4p-1076L : inexact-ok underflow errno-erange-ok
+= tan upward ldbl-128ibm 0x4p-1076L : 0x8p-1076L : inexact-ok underflow errno-erange-ok
+= tan downward ldbl-96-intel 0x8p-16448L : 0x8p-16448L : inexact-ok underflow errno-erange-ok
+= tan tonearest ldbl-96-intel 0x8p-16448L : 0x8p-16448L : inexact-ok underflow errno-erange-ok
+= tan towardzero ldbl-96-intel 0x8p-16448L : 0x8p-16448L : inexact-ok underflow errno-erange-ok
+= tan upward ldbl-96-intel 0x8p-16448L : 0x1p-16444L : inexact-ok underflow errno-erange-ok
+= tan downward ldbl-96-m68k 0x8p-16448L : 0x8p-16448L : inexact-ok underflow errno-erange-ok
+= tan tonearest ldbl-96-m68k 0x8p-16448L : 0x8p-16448L : inexact-ok underflow errno-erange-ok
+= tan towardzero ldbl-96-m68k 0x8p-16448L : 0x8p-16448L : inexact-ok underflow errno-erange-ok
+= tan upward ldbl-96-m68k 0x8p-16448L : 0xcp-16448L : inexact-ok underflow errno-erange-ok
+= tan downward ldbl-128 0x8p-16448L : 0x8p-16448L : inexact-ok underflow errno-erange-ok
+= tan tonearest ldbl-128 0x8p-16448L : 0x8p-16448L : inexact-ok underflow errno-erange-ok
+= tan towardzero ldbl-128 0x8p-16448L : 0x8p-16448L : inexact-ok underflow errno-erange-ok
+= tan upward ldbl-128 0x8p-16448L : 0x8.000000000004p-16448L : inexact-ok underflow errno-erange-ok
+= tan downward ldbl-96-m68k 0x4p-16448L : 0x4p-16448L : inexact-ok underflow errno-erange-ok
+= tan tonearest ldbl-96-m68k 0x4p-16448L : 0x4p-16448L : inexact-ok underflow errno-erange-ok
+= tan towardzero ldbl-96-m68k 0x4p-16448L : 0x4p-16448L : inexact-ok underflow errno-erange-ok
+= tan upward ldbl-96-m68k 0x4p-16448L : 0x8p-16448L : inexact-ok underflow errno-erange-ok
+= tan downward ldbl-128 0x4p-16448L : 0x4p-16448L : inexact-ok underflow errno-erange-ok
+= tan tonearest ldbl-128 0x4p-16448L : 0x4p-16448L : inexact-ok underflow errno-erange-ok
+= tan towardzero ldbl-128 0x4p-16448L : 0x4p-16448L : inexact-ok underflow errno-erange-ok
+= tan upward ldbl-128 0x4p-16448L : 0x4.000000000004p-16448L : inexact-ok underflow errno-erange-ok
+= tan downward ldbl-128 0x4p-16496L : 0x4p-16496L : inexact-ok underflow errno-erange-ok
+= tan tonearest ldbl-128 0x4p-16496L : 0x4p-16496L : inexact-ok underflow errno-erange-ok
+= tan towardzero ldbl-128 0x4p-16496L : 0x4p-16496L : inexact-ok underflow errno-erange-ok
+= tan upward ldbl-128 0x4p-16496L : 0x8p-16496L : inexact-ok underflow errno-erange-ok
+tan -min_subnorm
+= tan downward flt-32 -0x8p-152f : -0x1p-148f : inexact-ok underflow errno-erange-ok
+= tan tonearest flt-32 -0x8p-152f : -0x8p-152f : inexact-ok underflow errno-erange-ok
+= tan towardzero flt-32 -0x8p-152f : -0x8p-152f : inexact-ok underflow errno-erange-ok
+= tan upward flt-32 -0x8p-152f : -0x8p-152f : inexact-ok underflow errno-erange-ok
+= tan downward dbl-64 -0x8p-152 : -0x8.0000000000008p-152 : inexact-ok
+= tan tonearest dbl-64 -0x8p-152 : -0x8p-152 : inexact-ok
+= tan towardzero dbl-64 -0x8p-152 : -0x8p-152 : inexact-ok
+= tan upward dbl-64 -0x8p-152 : -0x8p-152 : inexact-ok
+= tan downward ldbl-96-intel -0x8p-152L : -0x8.000000000000001p-152L : inexact-ok
+= tan tonearest ldbl-96-intel -0x8p-152L : -0x8p-152L : inexact-ok
+= tan towardzero ldbl-96-intel -0x8p-152L : -0x8p-152L : inexact-ok
+= tan upward ldbl-96-intel -0x8p-152L : -0x8p-152L : inexact-ok
+= tan downward ldbl-96-m68k -0x8p-152L : -0x8.000000000000001p-152L : inexact-ok
+= tan tonearest ldbl-96-m68k -0x8p-152L : -0x8p-152L : inexact-ok
+= tan towardzero ldbl-96-m68k -0x8p-152L : -0x8p-152L : inexact-ok
+= tan upward ldbl-96-m68k -0x8p-152L : -0x8p-152L : inexact-ok
+= tan downward ldbl-128 -0x8p-152L : -0x8.0000000000000000000000000008p-152L : inexact-ok
+= tan tonearest ldbl-128 -0x8p-152L : -0x8p-152L : inexact-ok
+= tan towardzero ldbl-128 -0x8p-152L : -0x8p-152L : inexact-ok
+= tan upward ldbl-128 -0x8p-152L : -0x8p-152L : inexact-ok
+= tan downward ldbl-128ibm -0x8p-152L : -0x8.00000000000000000000000004p-152L : inexact-ok
+= tan tonearest ldbl-128ibm -0x8p-152L : -0x8p-152L : inexact-ok
+= tan towardzero ldbl-128ibm -0x8p-152L : -0x8p-152L : inexact-ok
+= tan upward ldbl-128ibm -0x8p-152L : -0x8p-152L : inexact-ok
+= tan downward dbl-64 -0x4p-1076 : -0x8p-1076 : inexact-ok underflow errno-erange-ok
+= tan tonearest dbl-64 -0x4p-1076 : -0x4p-1076 : inexact-ok underflow errno-erange-ok
+= tan towardzero dbl-64 -0x4p-1076 : -0x4p-1076 : inexact-ok underflow errno-erange-ok
+= tan upward dbl-64 -0x4p-1076 : -0x4p-1076 : inexact-ok underflow errno-erange-ok
+= tan downward ldbl-96-intel -0x4p-1076L : -0x4.0000000000000008p-1076L : inexact-ok
+= tan tonearest ldbl-96-intel -0x4p-1076L : -0x4p-1076L : inexact-ok
+= tan towardzero ldbl-96-intel -0x4p-1076L : -0x4p-1076L : inexact-ok
+= tan upward ldbl-96-intel -0x4p-1076L : -0x4p-1076L : inexact-ok
+= tan downward ldbl-96-m68k -0x4p-1076L : -0x4.0000000000000008p-1076L : inexact-ok
+= tan tonearest ldbl-96-m68k -0x4p-1076L : -0x4p-1076L : inexact-ok
+= tan towardzero ldbl-96-m68k -0x4p-1076L : -0x4p-1076L : inexact-ok
+= tan upward ldbl-96-m68k -0x4p-1076L : -0x4p-1076L : inexact-ok
+= tan downward ldbl-128 -0x4p-1076L : -0x4.0000000000000000000000000004p-1076L : inexact-ok
+= tan tonearest ldbl-128 -0x4p-1076L : -0x4p-1076L : inexact-ok
+= tan towardzero ldbl-128 -0x4p-1076L : -0x4p-1076L : inexact-ok
+= tan upward ldbl-128 -0x4p-1076L : -0x4p-1076L : inexact-ok
+= tan downward ldbl-128ibm -0x4p-1076L : -0x8p-1076L : inexact-ok underflow errno-erange-ok
+= tan tonearest ldbl-128ibm -0x4p-1076L : -0x4p-1076L : inexact-ok underflow errno-erange-ok
+= tan towardzero ldbl-128ibm -0x4p-1076L : -0x4p-1076L : inexact-ok underflow errno-erange-ok
+= tan upward ldbl-128ibm -0x4p-1076L : -0x4p-1076L : inexact-ok underflow errno-erange-ok
+= tan downward ldbl-96-intel -0x8p-16448L : -0x1p-16444L : inexact-ok underflow errno-erange-ok
+= tan tonearest ldbl-96-intel -0x8p-16448L : -0x8p-16448L : inexact-ok underflow errno-erange-ok
+= tan towardzero ldbl-96-intel -0x8p-16448L : -0x8p-16448L : inexact-ok underflow errno-erange-ok
+= tan upward ldbl-96-intel -0x8p-16448L : -0x8p-16448L : inexact-ok underflow errno-erange-ok
+= tan downward ldbl-96-m68k -0x8p-16448L : -0xcp-16448L : inexact-ok underflow errno-erange-ok
+= tan tonearest ldbl-96-m68k -0x8p-16448L : -0x8p-16448L : inexact-ok underflow errno-erange-ok
+= tan towardzero ldbl-96-m68k -0x8p-16448L : -0x8p-16448L : inexact-ok underflow errno-erange-ok
+= tan upward ldbl-96-m68k -0x8p-16448L : -0x8p-16448L : inexact-ok underflow errno-erange-ok
+= tan downward ldbl-128 -0x8p-16448L : -0x8.000000000004p-16448L : inexact-ok underflow errno-erange-ok
+= tan tonearest ldbl-128 -0x8p-16448L : -0x8p-16448L : inexact-ok underflow errno-erange-ok
+= tan towardzero ldbl-128 -0x8p-16448L : -0x8p-16448L : inexact-ok underflow errno-erange-ok
+= tan upward ldbl-128 -0x8p-16448L : -0x8p-16448L : inexact-ok underflow errno-erange-ok
+= tan downward ldbl-96-m68k -0x4p-16448L : -0x8p-16448L : inexact-ok underflow errno-erange-ok
+= tan tonearest ldbl-96-m68k -0x4p-16448L : -0x4p-16448L : inexact-ok underflow errno-erange-ok
+= tan towardzero ldbl-96-m68k -0x4p-16448L : -0x4p-16448L : inexact-ok underflow errno-erange-ok
+= tan upward ldbl-96-m68k -0x4p-16448L : -0x4p-16448L : inexact-ok underflow errno-erange-ok
+= tan downward ldbl-128 -0x4p-16448L : -0x4.000000000004p-16448L : inexact-ok underflow errno-erange-ok
+= tan tonearest ldbl-128 -0x4p-16448L : -0x4p-16448L : inexact-ok underflow errno-erange-ok
+= tan towardzero ldbl-128 -0x4p-16448L : -0x4p-16448L : inexact-ok underflow errno-erange-ok
+= tan upward ldbl-128 -0x4p-16448L : -0x4p-16448L : inexact-ok underflow errno-erange-ok
+= tan downward ldbl-128 -0x4p-16496L : -0x8p-16496L : inexact-ok underflow errno-erange-ok
+= tan tonearest ldbl-128 -0x4p-16496L : -0x4p-16496L : inexact-ok underflow errno-erange-ok
+= tan towardzero ldbl-128 -0x4p-16496L : -0x4p-16496L : inexact-ok underflow errno-erange-ok
+= tan upward ldbl-128 -0x4p-16496L : -0x4p-16496L : inexact-ok underflow errno-erange-ok
 tanh 0
 = tanh downward flt-32 0x0p+0f : 0x0p+0f : inexact-ok
 = tanh tonearest flt-32 0x0p+0f : 0x0p+0f : inexact-ok
diff --git a/sysdeps/ieee754/dbl-64/s_tan.c b/sysdeps/ieee754/dbl-64/s_tan.c
index dcb4aca2de..b4e3bd2a31 100644
--- a/sysdeps/ieee754/dbl-64/s_tan.c
+++ b/sysdeps/ieee754/dbl-64/s_tan.c
@@ -34,6 +34,7 @@
 /*********************************************************************/
 
 #include <errno.h>
+#include <float.h>
 #include "endian.h"
 #include <dla.h>
 #include "mpa.h"
@@ -91,6 +92,11 @@ tan (double x)
   /* (I) The case abs(x) <= 1.259e-8 */
   if (w <= g1.d)
     {
+      if (w < DBL_MIN)
+	{
+	  double force_underflow = x * x;
+	  math_force_eval (force_underflow);
+	}
       retval = x;
       goto ret;
     }
diff --git a/sysdeps/ieee754/flt-32/k_tanf.c b/sysdeps/ieee754/flt-32/k_tanf.c
index a67f36e283..2f2076d6fe 100644
--- a/sysdeps/ieee754/flt-32/k_tanf.c
+++ b/sysdeps/ieee754/flt-32/k_tanf.c
@@ -17,6 +17,7 @@
 static char rcsid[] = "$NetBSD: k_tanf.c,v 1.4 1995/05/10 20:46:39 jtc Exp $";
 #endif
 
+#include <float.h>
 #include <math.h>
 #include <math_private.h>
 static const float
@@ -48,7 +49,17 @@ float __kernel_tanf(float x, float y, int iy)
 	if(ix<0x39000000)			/* x < 2**-13 */
 	    {if((int)x==0) {			/* generate inexact */
 		if((ix|(iy+1))==0) return one/fabsf(x);
-		else return (iy==1)? x: -one/x;
+		else if (iy == 1)
+		  {
+		    if (fabsf (x) < FLT_MIN)
+		      {
+			float force_underflow = x * x;
+			math_force_eval (force_underflow);
+		      }
+		    return x;
+		  }
+		else
+		  return -one / x;
 	    }
 	    }
 	if(ix>=0x3f2ca140) { 			/* |x|>=0.6744 */
diff --git a/sysdeps/ieee754/ldbl-128/k_tanl.c b/sysdeps/ieee754/ldbl-128/k_tanl.c
index dfba2d9a76..6a6fa9f0a6 100644
--- a/sysdeps/ieee754/ldbl-128/k_tanl.c
+++ b/sysdeps/ieee754/ldbl-128/k_tanl.c
@@ -56,6 +56,7 @@
  *		       = 1 - 2*(tan(y) - (tan(y)^2)/(1+tan(y)))
  */
 
+#include <float.h>
 #include <libc-internal.h>
 #include <math.h>
 #include <math_private.h>
@@ -98,8 +99,17 @@ __kernel_tanl (long double x, long double y, int iy)
 	  if ((ix | u.parts32.w1 | u.parts32.w2 | u.parts32.w3
 	       | (iy + 1)) == 0)
 	    return one / fabs (x);
+	  else if (iy == 1)
+	    {
+	      if (fabsl (x) < LDBL_MIN)
+		{
+		  long double force_underflow = x * x;
+		  math_force_eval (force_underflow);
+		}
+	      return x;
+	    }
 	  else
-	    return (iy == 1) ? x : -one / x;
+	    return -one / x;
 	}
     }
   if (ix >= 0x3ffe5942) /* |x| >= 0.6743316650390625 */
diff --git a/sysdeps/ieee754/ldbl-128ibm/k_tanl.c b/sysdeps/ieee754/ldbl-128ibm/k_tanl.c
index 7f1caeebdf..e50cc88da4 100644
--- a/sysdeps/ieee754/ldbl-128ibm/k_tanl.c
+++ b/sysdeps/ieee754/ldbl-128ibm/k_tanl.c
@@ -56,6 +56,7 @@
  *		       = 1 - 2*(tan(y) - (tan(y)^2)/(1+tan(y)))
  */
 
+#include <float.h>
 #include <libc-internal.h>
 #include <math.h>
 #include <math_private.h>
@@ -98,8 +99,17 @@ __kernel_tanl (long double x, long double y, int iy)
 	{
 	  if ((ix | lx | (iy + 1)) == 0)
 	    return one / fabs (x);
+	  else if (iy == 1)
+	    {
+	      if (fabsl (x) < LDBL_MIN)
+		{
+		  long double force_underflow = x * x;
+		  math_force_eval (force_underflow);
+		}
+	      return x;
+	    }
 	  else
-	    return (iy == 1) ? x : -one / x;
+	    return -one / x;
 	}
     }
   if (ix >= 0x3fe59420) /* |x| >= 0.6743316650390625 */
diff --git a/sysdeps/ieee754/ldbl-96/k_tanl.c b/sysdeps/ieee754/ldbl-96/k_tanl.c
index 31cd236aa2..ae6821d984 100644
--- a/sysdeps/ieee754/ldbl-96/k_tanl.c
+++ b/sysdeps/ieee754/ldbl-96/k_tanl.c
@@ -56,6 +56,7 @@
  *		       = 1 - 2*(tan(y) - (tan(y)^2)/(1+tan(y)))
  */
 
+#include <float.h>
 #include <math.h>
 #include <math_private.h>
 static const long double
@@ -94,8 +95,17 @@ __kernel_tanl (long double x, long double y, int iy)
 	{			/* generate inexact */
 	  if (x == 0 && iy == -1)
 	    return one / fabsl (x);
+	  else if (iy == 1)
+	    {
+	      if (absx < LDBL_MIN)
+		{
+		  long double force_underflow = x * x;
+		  math_force_eval (force_underflow);
+		}
+	      return x;
+	    }
 	  else
-	    return (iy == 1) ? x : -one / x;
+	    return -one / x;
 	}
     }
   if (absx >= 0.6743316650390625L)