]> sourceware.org Git - glibc.git/commitdiff
Fix tanf spurious underflows (bug 18221).
authorJoseph Myers <joseph@codesourcery.com>
Fri, 15 May 2015 17:47:29 +0000 (17:47 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Fri, 15 May 2015 17:47:29 +0000 (17:47 +0000)
The flt-32 implementation of tanf produces spurious underflow
exceptions for some small arguments, through computing values on the
order of x^5.  This patch fixes this by adjusting the threshold for
returning x (or, as applicable, +/- 1/x) to 2**-13 (the next term in
the power series being x^3/3).

Tested for x86_64 and x86.

[BZ #18221]
* sysdeps/ieee754/flt-32/k_tanf.c (__kernel_tanf): Use 2**-13 not
2**-28 as threshold for returning x or +/- 1/x.
* 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/flt-32/k_tanf.c

index 2b29214422bac94993bf35b0685eefe1075f3563..92b4e2dac0cc7fbc40298cc0599551e21bf2fdb0 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
 2015-05-15  Joseph Myers  <joseph@codesourcery.com>
 
+       [BZ #18221]
+       * sysdeps/ieee754/flt-32/k_tanf.c (__kernel_tanf): Use 2**-13 not
+       2**-28 as threshold for returning x or +/- 1/x.
+       * math/auto-libm-test-in: Add more tests of tan.
+       * math/auto-libm-test-out: Regenerated.
+
        [BZ #18220]
        * sysdeps/ieee754/flt-32/e_lgammaf_r.c (__ieee754_lgammaf_r): Use
        2**26 not 2**58 as threshold for returning x * (log (x) - 1).
diff --git a/NEWS b/NEWS
index b85ba6017d5d7fa2c383b83b023f286b04810922..44803fad662ee4505823b0f5eabcced858a58664 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -17,7 +17,7 @@ Version 2.22
   17999, 18007, 18019, 18020, 18029, 18030, 18032, 18036, 18038, 18039,
   18042, 18043, 18046, 18047, 18068, 18080, 18093, 18100, 18104, 18110,
   18111, 18125, 18128, 18138, 18185, 18196, 18197, 18206, 18210, 18211,
-  18217, 18220, 18247, 18287, 18319, 18333, 18346, 18397, 18409.
+  18217, 18220, 18221, 18247, 18287, 18319, 18333, 18346, 18397, 18409.
 
 * Cache information can be queried via sysconf() function on s390 e.g. with
   _SC_LEVEL1_ICACHE_SIZE as argument.
index 2a88403aa72cc784cd7bafa2ba6d1ee0d82937bb..e483569dad7acfebfb894291f7f5c99dd30b587f 100644 (file)
@@ -2418,6 +2418,8 @@ tan pi/4
 tan 0.75
 tan 0x1p65
 tan -0x1p65
+tan 0x1p-27
+tan -0x1p-27
 tan 0xc.9p-4
 tan 0xc.908p-4
 tan 0xc.90cp-4
index 0aa7b75c3b88dece4003dd19acf075bdf01deb26..d7bfbb3b7cbb830ffdf962d7e9f9ec0f4e2853db 100644 (file)
@@ -186618,6 +186618,56 @@ tan -0x1p65
 = tan tonearest ldbl-128ibm -0x2p+64L : 0xc.17b0bfdb2b8061e7b11d500874p-8L : inexact-ok
 = tan towardzero ldbl-128ibm -0x2p+64L : 0xc.17b0bfdb2b8061e7b11d50087p-8L : inexact-ok
 = tan upward ldbl-128ibm -0x2p+64L : 0xc.17b0bfdb2b8061e7b11d500874p-8L : inexact-ok
+tan 0x1p-27
+= tan downward flt-32 0x2p-28f : 0x2p-28f : inexact-ok
+= tan tonearest flt-32 0x2p-28f : 0x2p-28f : inexact-ok
+= tan towardzero flt-32 0x2p-28f : 0x2p-28f : inexact-ok
+= tan upward flt-32 0x2p-28f : 0x2.000004p-28f : inexact-ok
+= tan downward dbl-64 0x2p-28 : 0x2p-28 : inexact-ok
+= tan tonearest dbl-64 0x2p-28 : 0x2p-28 : inexact-ok
+= tan towardzero dbl-64 0x2p-28 : 0x2p-28 : inexact-ok
+= tan upward dbl-64 0x2p-28 : 0x2.0000000000002p-28 : inexact-ok
+= tan downward ldbl-96-intel 0x2p-28L : 0x2.00000000000002a8p-28L : inexact-ok
+= tan tonearest ldbl-96-intel 0x2p-28L : 0x2.00000000000002acp-28L : inexact-ok
+= tan towardzero ldbl-96-intel 0x2p-28L : 0x2.00000000000002a8p-28L : inexact-ok
+= tan upward ldbl-96-intel 0x2p-28L : 0x2.00000000000002acp-28L : inexact-ok
+= tan downward ldbl-96-m68k 0x2p-28L : 0x2.00000000000002a8p-28L : inexact-ok
+= tan tonearest ldbl-96-m68k 0x2p-28L : 0x2.00000000000002acp-28L : inexact-ok
+= tan towardzero ldbl-96-m68k 0x2p-28L : 0x2.00000000000002a8p-28L : inexact-ok
+= tan upward ldbl-96-m68k 0x2p-28L : 0x2.00000000000002acp-28L : inexact-ok
+= tan downward ldbl-128 0x2p-28L : 0x2.00000000000002aaaaaaaaaaaaaep-28L : inexact-ok
+= tan tonearest ldbl-128 0x2p-28L : 0x2.00000000000002aaaaaaaaaaaaaep-28L : inexact-ok
+= tan towardzero ldbl-128 0x2p-28L : 0x2.00000000000002aaaaaaaaaaaaaep-28L : inexact-ok
+= tan upward ldbl-128 0x2p-28L : 0x2.00000000000002aaaaaaaaaaaabp-28L : inexact-ok
+= tan downward ldbl-128ibm 0x2p-28L : 0x2.00000000000002aaaaaaaaaaaap-28L : inexact-ok
+= tan tonearest ldbl-128ibm 0x2p-28L : 0x2.00000000000002aaaaaaaaaaabp-28L : inexact-ok
+= tan towardzero ldbl-128ibm 0x2p-28L : 0x2.00000000000002aaaaaaaaaaaap-28L : inexact-ok
+= tan upward ldbl-128ibm 0x2p-28L : 0x2.00000000000002aaaaaaaaaaabp-28L : inexact-ok
+tan -0x1p-27
+= tan downward flt-32 -0x2p-28f : -0x2.000004p-28f : inexact-ok
+= tan tonearest flt-32 -0x2p-28f : -0x2p-28f : inexact-ok
+= tan towardzero flt-32 -0x2p-28f : -0x2p-28f : inexact-ok
+= tan upward flt-32 -0x2p-28f : -0x2p-28f : inexact-ok
+= tan downward dbl-64 -0x2p-28 : -0x2.0000000000002p-28 : inexact-ok
+= tan tonearest dbl-64 -0x2p-28 : -0x2p-28 : inexact-ok
+= tan towardzero dbl-64 -0x2p-28 : -0x2p-28 : inexact-ok
+= tan upward dbl-64 -0x2p-28 : -0x2p-28 : inexact-ok
+= tan downward ldbl-96-intel -0x2p-28L : -0x2.00000000000002acp-28L : inexact-ok
+= tan tonearest ldbl-96-intel -0x2p-28L : -0x2.00000000000002acp-28L : inexact-ok
+= tan towardzero ldbl-96-intel -0x2p-28L : -0x2.00000000000002a8p-28L : inexact-ok
+= tan upward ldbl-96-intel -0x2p-28L : -0x2.00000000000002a8p-28L : inexact-ok
+= tan downward ldbl-96-m68k -0x2p-28L : -0x2.00000000000002acp-28L : inexact-ok
+= tan tonearest ldbl-96-m68k -0x2p-28L : -0x2.00000000000002acp-28L : inexact-ok
+= tan towardzero ldbl-96-m68k -0x2p-28L : -0x2.00000000000002a8p-28L : inexact-ok
+= tan upward ldbl-96-m68k -0x2p-28L : -0x2.00000000000002a8p-28L : inexact-ok
+= tan downward ldbl-128 -0x2p-28L : -0x2.00000000000002aaaaaaaaaaaabp-28L : inexact-ok
+= tan tonearest ldbl-128 -0x2p-28L : -0x2.00000000000002aaaaaaaaaaaaaep-28L : inexact-ok
+= tan towardzero ldbl-128 -0x2p-28L : -0x2.00000000000002aaaaaaaaaaaaaep-28L : inexact-ok
+= tan upward ldbl-128 -0x2p-28L : -0x2.00000000000002aaaaaaaaaaaaaep-28L : inexact-ok
+= tan downward ldbl-128ibm -0x2p-28L : -0x2.00000000000002aaaaaaaaaaabp-28L : inexact-ok
+= tan tonearest ldbl-128ibm -0x2p-28L : -0x2.00000000000002aaaaaaaaaaabp-28L : inexact-ok
+= tan towardzero ldbl-128ibm -0x2p-28L : -0x2.00000000000002aaaaaaaaaaaap-28L : inexact-ok
+= tan upward ldbl-128ibm -0x2p-28L : -0x2.00000000000002aaaaaaaaaaaap-28L : inexact-ok
 tan 0xc.9p-4
 = tan downward flt-32 0xc.9p-4f : 0xf.fe04cp-4f : inexact-ok
 = tan tonearest flt-32 0xc.9p-4f : 0xf.fe04dp-4f : inexact-ok
index d9188263386c13aa533c7ddf9dba13a4ba106fc3..a67f36e283f7771846b2ccb03d74519ce9c96b00 100644 (file)
@@ -45,7 +45,7 @@ float __kernel_tanf(float x, float y, int iy)
        int32_t ix,hx;
        GET_FLOAT_WORD(hx,x);
        ix = hx&0x7fffffff;     /* high word of |x| */
-       if(ix<0x31800000)                       /* x < 2**-28 */
+       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;
This page took 0.542451 seconds and 5 git commands to generate.