]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
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 ac1383427d68415fe5a98067f404bd88f1dd17d3..473ed336ae24c17882ac447d143ab0e370c9f10e 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 bb45b92ecfc364db356243d110bfd4a26d637228..bb4a4c24c601e5139e172aa7cd0b7917941029e4 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 cc9b7fd31850913330c49d84e4a1006566ff6a98..bb6d30e6f51076deaf1ae58f551d4e543c48c97e 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 81abc0cf4daae0c06feb63811f83ca3ee16d4b23..a31039419dd4cef25860adc55575c9f11718a4dd 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 dcb4aca2de4c2ff1e09bd55251d9dcb0a6b27d43..b4e3bd2a31976b1a09f98df3adaada33e13c1704 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 a67f36e283f7771846b2ccb03d74519ce9c96b00..2f2076d6fe0caa635a682b2d2b7dfd0e62fb52c0 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 dfba2d9a76e5e453d82bc5dd43835d481f8b78a4..6a6fa9f0a68139f39e15ca229a9cbf73698d02e0 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 7f1caeebdf9e7ca266a9cb68e65c179de79b54b3..e50cc88da445b9b30a630a288981bfa1a70d8c33 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 31cd236aa25988d81cf0cf69615534f94959cd76..ae6821d9844fd134c576068bd94b0acecadbe290 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)