summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2015-08-07 23:10:35 +0000
committerJoseph Myers <joseph@codesourcery.com>2015-08-07 23:10:35 +0000
commit37550cb3d6591a8f443467707ec80b4ab5c2e157 (patch)
tree934ef1da0ab3a2cd9d0a23b1645392914e95afcc
parentdb2bcbcb631f1c1aa023ef9f23a968e1ac288423 (diff)
Fix tan missing underflows (bug 16517).
Similar to various other bugs in this area, some tan implementations do not raise the underflow exception for subnormal arguments, when the result is tiny and inexact. This patch forces the exception in a similar way to previous fixes. Tested for x86_64, x86, mips64 and powerpc. [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.
-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)