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:
Joseph Myers 2015-05-14 23:51:09 +00:00
parent 0b7a5f9201
commit 9a71f1fcf5
5 changed files with 35 additions and 3 deletions

View File

@ -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
View File

@ -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.

View File

@ -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

View File

@ -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

View File

@ -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];