mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-27 11:43:34 +08:00
Fix atanf spurious underflows (bug 18196).
The sysdeps/ieee754/flt-32 version of atanf produces spurious underflow exceptions for some large arguments, because of computations that compute x^-4. This patch fixes this by adjusting the threshold for large arguments (for which +/- pi/2 can just be returned, the correct result being roughly +/- pi/2 - 1/x) from 2^34 to 2^25. Tested for x86_64 and x86. [BZ #18196] * sysdeps/ieee754/flt-32/s_atanf.c (__atanf): Use 2^25 not 2^34 as threshold for large arguments. * math/auto-libm-test-in: Add another test of atan. * math/auto-libm-test-out: Regenerated.
This commit is contained in:
parent
0b7a5f9201
commit
9a71f1fcf5
@ -1,5 +1,11 @@
|
|||||||
2015-05-14 Joseph Myers <joseph@codesourcery.com>
|
2015-05-14 Joseph Myers <joseph@codesourcery.com>
|
||||||
|
|
||||||
|
[BZ #18196]
|
||||||
|
* sysdeps/ieee754/flt-32/s_atanf.c (__atanf): Use 2^25 not 2^34 as
|
||||||
|
threshold for large arguments.
|
||||||
|
* math/auto-libm-test-in: Add another test of atan.
|
||||||
|
* math/auto-libm-test-out: Regenerated.
|
||||||
|
|
||||||
[BZ #16339]
|
[BZ #16339]
|
||||||
* sysdeps/i386/fpu/s_log1p.S (dbl_min): New object.
|
* sysdeps/i386/fpu/s_log1p.S (dbl_min): New object.
|
||||||
(__log1p): Force underflow exception for results with small
|
(__log1p): Force underflow exception for results with small
|
||||||
|
4
NEWS
4
NEWS
@ -16,8 +16,8 @@ Version 2.22
|
|||||||
17964, 17965, 17967, 17969, 17978, 17987, 17991, 17996, 17998, 17999,
|
17964, 17965, 17967, 17969, 17978, 17987, 17991, 17996, 17998, 17999,
|
||||||
18007, 18019, 18020, 18029, 18030, 18032, 18036, 18038, 18039, 18042,
|
18007, 18019, 18020, 18029, 18030, 18032, 18036, 18038, 18039, 18042,
|
||||||
18043, 18046, 18047, 18068, 18080, 18093, 18100, 18104, 18110, 18111,
|
18043, 18046, 18047, 18068, 18080, 18093, 18100, 18104, 18110, 18111,
|
||||||
18125, 18128, 18138, 18185, 18197, 18206, 18210, 18211, 18247, 18287,
|
18125, 18128, 18138, 18185, 18196, 18197, 18206, 18210, 18211, 18247,
|
||||||
18319, 18333, 18346, 18397, 18409.
|
18287, 18319, 18333, 18346, 18397, 18409.
|
||||||
|
|
||||||
* Cache information can be queried via sysconf() function on s390 e.g. with
|
* Cache information can be queried via sysconf() function on s390 e.g. with
|
||||||
_SC_LEVEL1_ICACHE_SIZE as argument.
|
_SC_LEVEL1_ICACHE_SIZE as argument.
|
||||||
|
@ -239,6 +239,7 @@ atan 0x1p-5
|
|||||||
atan 2.5
|
atan 2.5
|
||||||
atan 10
|
atan 10
|
||||||
atan 1e6
|
atan 1e6
|
||||||
|
atan 0x1p31
|
||||||
atan 0x1p-100
|
atan 0x1p-100
|
||||||
atan 0x1p-600
|
atan 0x1p-600
|
||||||
atan 0x1p-10000
|
atan 0x1p-10000
|
||||||
|
@ -7796,6 +7796,31 @@ atan 1e6
|
|||||||
= atan tonearest ldbl-128ibm 0xf.424p+16L : 0x1.921fa47d4b30ce822275563fcb8p+0L : inexact-ok
|
= atan tonearest ldbl-128ibm 0xf.424p+16L : 0x1.921fa47d4b30ce822275563fcb8p+0L : inexact-ok
|
||||||
= atan towardzero ldbl-128ibm 0xf.424p+16L : 0x1.921fa47d4b30ce822275563fcb8p+0L : inexact-ok
|
= atan towardzero ldbl-128ibm 0xf.424p+16L : 0x1.921fa47d4b30ce822275563fcb8p+0L : inexact-ok
|
||||||
= atan upward ldbl-128ibm 0xf.424p+16L : 0x1.921fa47d4b30ce822275563fccp+0L : inexact-ok
|
= atan upward ldbl-128ibm 0xf.424p+16L : 0x1.921fa47d4b30ce822275563fccp+0L : inexact-ok
|
||||||
|
atan 0x1p31
|
||||||
|
= atan downward flt-32 0x8p+28f : 0x1.921fb4p+0f : inexact-ok
|
||||||
|
= atan tonearest flt-32 0x8p+28f : 0x1.921fb6p+0f : inexact-ok
|
||||||
|
= atan towardzero flt-32 0x8p+28f : 0x1.921fb4p+0f : inexact-ok
|
||||||
|
= atan upward flt-32 0x8p+28f : 0x1.921fb6p+0f : inexact-ok
|
||||||
|
= atan downward dbl-64 0x8p+28 : 0x1.921fb54242d18p+0 : inexact-ok
|
||||||
|
= atan tonearest dbl-64 0x8p+28 : 0x1.921fb54242d18p+0 : inexact-ok
|
||||||
|
= atan towardzero dbl-64 0x8p+28 : 0x1.921fb54242d18p+0 : inexact-ok
|
||||||
|
= atan upward dbl-64 0x8p+28 : 0x1.921fb54242d19p+0 : inexact-ok
|
||||||
|
= atan downward ldbl-96-intel 0x8p+28L : 0x1.921fb54242d18468p+0L : inexact-ok
|
||||||
|
= atan tonearest ldbl-96-intel 0x8p+28L : 0x1.921fb54242d1846ap+0L : inexact-ok
|
||||||
|
= atan towardzero ldbl-96-intel 0x8p+28L : 0x1.921fb54242d18468p+0L : inexact-ok
|
||||||
|
= atan upward ldbl-96-intel 0x8p+28L : 0x1.921fb54242d1846ap+0L : inexact-ok
|
||||||
|
= atan downward ldbl-96-m68k 0x8p+28L : 0x1.921fb54242d18468p+0L : inexact-ok
|
||||||
|
= atan tonearest ldbl-96-m68k 0x8p+28L : 0x1.921fb54242d1846ap+0L : inexact-ok
|
||||||
|
= atan towardzero ldbl-96-m68k 0x8p+28L : 0x1.921fb54242d18468p+0L : inexact-ok
|
||||||
|
= atan upward ldbl-96-m68k 0x8p+28L : 0x1.921fb54242d1846ap+0L : inexact-ok
|
||||||
|
= atan downward ldbl-128 0x8p+28L : 0x1.921fb54242d18469898cc519ac62p+0L : inexact-ok
|
||||||
|
= atan tonearest ldbl-128 0x8p+28L : 0x1.921fb54242d18469898cc519ac63p+0L : inexact-ok
|
||||||
|
= atan towardzero ldbl-128 0x8p+28L : 0x1.921fb54242d18469898cc519ac62p+0L : inexact-ok
|
||||||
|
= atan upward ldbl-128 0x8p+28L : 0x1.921fb54242d18469898cc519ac63p+0L : inexact-ok
|
||||||
|
= atan downward ldbl-128ibm 0x8p+28L : 0x1.921fb54242d18469898cc519acp+0L : inexact-ok
|
||||||
|
= atan tonearest ldbl-128ibm 0x8p+28L : 0x1.921fb54242d18469898cc519ac8p+0L : inexact-ok
|
||||||
|
= atan towardzero ldbl-128ibm 0x8p+28L : 0x1.921fb54242d18469898cc519acp+0L : inexact-ok
|
||||||
|
= atan upward ldbl-128ibm 0x8p+28L : 0x1.921fb54242d18469898cc519ac8p+0L : inexact-ok
|
||||||
atan 0x1p-100
|
atan 0x1p-100
|
||||||
= atan downward flt-32 0x1p-100f : 0xf.fffffp-104f : inexact-ok
|
= atan downward flt-32 0x1p-100f : 0xf.fffffp-104f : inexact-ok
|
||||||
= atan tonearest flt-32 0x1p-100f : 0x1p-100f : inexact-ok
|
= atan tonearest flt-32 0x1p-100f : 0x1p-100f : inexact-ok
|
||||||
|
@ -60,7 +60,7 @@ float __atanf(float x)
|
|||||||
|
|
||||||
GET_FLOAT_WORD(hx,x);
|
GET_FLOAT_WORD(hx,x);
|
||||||
ix = hx&0x7fffffff;
|
ix = hx&0x7fffffff;
|
||||||
if(ix>=0x50800000) { /* if |x| >= 2^34 */
|
if(ix>=0x4c000000) { /* if |x| >= 2^25 */
|
||||||
if(ix>0x7f800000)
|
if(ix>0x7f800000)
|
||||||
return x+x; /* NaN */
|
return x+x; /* NaN */
|
||||||
if(hx>0) return atanhi[3]+atanlo[3];
|
if(hx>0) return atanhi[3]+atanlo[3];
|
||||||
|
Loading…
Reference in New Issue
Block a user