Fix tan missing underflows (bug 16517).
authorJoseph Myers <joseph@codesourcery.com>
Fri, 7 Aug 2015 23:10:35 +0000 (23:10 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Fri, 7 Aug 2015 23:10:35 +0000 (23:10 +0000)
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.

ChangeLog
NEWS
math/auto-libm-test-in
math/auto-libm-test-out
sysdeps/ieee754/dbl-64/s_tan.c
sysdeps/ieee754/flt-32/k_tanf.c
sysdeps/ieee754/ldbl-128/k_tanl.c
sysdeps/ieee754/ldbl-128ibm/k_tanl.c
sysdeps/ieee754/ldbl-96/k_tanl.c

index ac13834..473ed33 100644 (file)
--- 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 bb45b92..bb4a4c2 100644 (file)
--- 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.
 \f
 Version 2.22
 
index cc9b7fd..bb6d30e 100644 (file)
@@ -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
index 81abc0c..a310394 100644 (file)
@@ -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
index dcb4aca..b4e3bd2 100644 (file)
@@ -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;
     }
index a67f36e..2f2076d 100644 (file)
@@ -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 */
index dfba2d9..6a6fa9f 100644 (file)
@@ -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 */
index 7f1caee..e50cc88 100644 (file)
@@ -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 */
index 31cd236..ae6821d 100644 (file)
@@ -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)