mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-24 18:23:41 +08:00
Fix spurious underflows in ldbl-128 atan implementation.
With help from Joseph Myers. * sysdeps/ieee754/ldbl-128/s_atanl.c (__atanl): Handle tiny and very large arguments properly. * math/libm-test.inc (atan_test): New tests. (atan2_test): New tests. * sysdeps/sparc/fpu/libm-test-ulps: Update. * sysdeps/x86_64/fpu/libm-test-ulps: Update.
This commit is contained in:
parent
877f2d8e8d
commit
6d33cc9d9b
10
ChangeLog
10
ChangeLog
@ -1,3 +1,13 @@
|
|||||||
|
2012-11-19 David S. Miller <davem@davemloft.net>
|
||||||
|
|
||||||
|
With help from Joseph Myers.
|
||||||
|
* sysdeps/ieee754/ldbl-128/s_atanl.c (__atanl): Handle tiny and
|
||||||
|
very large arguments properly.
|
||||||
|
* math/libm-test.inc (atan_test): New tests.
|
||||||
|
(atan2_test): New tests.
|
||||||
|
* sysdeps/sparc/fpu/libm-test-ulps: Update.
|
||||||
|
* sysdeps/x86_64/fpu/libm-test-ulps: Update.
|
||||||
|
|
||||||
2012-11-19 Joseph Myers <joseph@codesourcery.com>
|
2012-11-19 Joseph Myers <joseph@codesourcery.com>
|
||||||
|
|
||||||
[BZ #14856]
|
[BZ #14856]
|
||||||
|
@ -1187,6 +1187,8 @@ atan_test (void)
|
|||||||
TEST_f_f (atan, plus_infty, M_PI_2l);
|
TEST_f_f (atan, plus_infty, M_PI_2l);
|
||||||
TEST_f_f (atan, minus_infty, -M_PI_2l);
|
TEST_f_f (atan, minus_infty, -M_PI_2l);
|
||||||
TEST_f_f (atan, nan_value, nan_value);
|
TEST_f_f (atan, nan_value, nan_value);
|
||||||
|
TEST_f_f (atan, max_value, M_PI_2l);
|
||||||
|
TEST_f_f (atan, -max_value, -M_PI_2l);
|
||||||
|
|
||||||
TEST_f_f (atan, 1, M_PI_4l);
|
TEST_f_f (atan, 1, M_PI_4l);
|
||||||
TEST_f_f (atan, -1, -M_PI_4l);
|
TEST_f_f (atan, -1, -M_PI_4l);
|
||||||
@ -1295,6 +1297,9 @@ atan2_test (void)
|
|||||||
|
|
||||||
TEST_ff_f (atan2, max_value, max_value, M_PI_4l);
|
TEST_ff_f (atan2, max_value, max_value, M_PI_4l);
|
||||||
|
|
||||||
|
TEST_ff_f (atan2, max_value, min_value, M_PI_2l);
|
||||||
|
TEST_ff_f (atan2, -max_value, -min_value, -M_PI_2l);
|
||||||
|
|
||||||
TEST_ff_f (atan2, 0.75L, 1, 0.643501108793284386802809228717322638L);
|
TEST_ff_f (atan2, 0.75L, 1, 0.643501108793284386802809228717322638L);
|
||||||
TEST_ff_f (atan2, -0.75L, 1.0L, -0.643501108793284386802809228717322638L);
|
TEST_ff_f (atan2, -0.75L, 1.0L, -0.643501108793284386802809228717322638L);
|
||||||
TEST_ff_f (atan2, 0.75L, -1.0L, 2.49809154479650885165983415456218025L);
|
TEST_ff_f (atan2, 0.75L, -1.0L, 2.49809154479650885165983415456218025L);
|
||||||
|
@ -167,6 +167,7 @@ static const long double
|
|||||||
q4 = 2.173623741810414221251136181221172551416E1L;
|
q4 = 2.173623741810414221251136181221172551416E1L;
|
||||||
/* q5 = 1.000000000000000000000000000000000000000E0 */
|
/* q5 = 1.000000000000000000000000000000000000000E0 */
|
||||||
|
|
||||||
|
static const long double huge = 1.0e4930L;
|
||||||
|
|
||||||
long double
|
long double
|
||||||
__atanl (long double x)
|
__atanl (long double x)
|
||||||
@ -197,6 +198,22 @@ __atanl (long double x)
|
|||||||
return atantbl[83];
|
return atantbl[83];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (k <= 0x3fc50000) /* |x| < 2**-58 */
|
||||||
|
{
|
||||||
|
/* Raise inexact. */
|
||||||
|
if (huge + x > 0.0)
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (k >= 0x40720000) /* |x| > 2**115 */
|
||||||
|
{
|
||||||
|
/* Saturate result to {-,+}pi/2 */
|
||||||
|
if (sign)
|
||||||
|
return -atantbl[83];
|
||||||
|
else
|
||||||
|
return atantbl[83];
|
||||||
|
}
|
||||||
|
|
||||||
if (sign)
|
if (sign)
|
||||||
x = -x;
|
x = -x;
|
||||||
|
|
||||||
|
@ -102,6 +102,9 @@ float: 1
|
|||||||
ifloat: 1
|
ifloat: 1
|
||||||
ildouble: 1
|
ildouble: 1
|
||||||
ldouble: 1
|
ldouble: 1
|
||||||
|
Test "atan2 (-max_value, -min_value) == -pi/2":
|
||||||
|
float: 1
|
||||||
|
ifloat: 1
|
||||||
Test "atan2 (0.75, -1.0) == 2.49809154479650885165983415456218025":
|
Test "atan2 (0.75, -1.0) == 2.49809154479650885165983415456218025":
|
||||||
float: 1
|
float: 1
|
||||||
ifloat: 1
|
ifloat: 1
|
||||||
|
@ -162,6 +162,9 @@ ldouble: 1
|
|||||||
Test "atan2 (-0.75, -1.0) == -2.49809154479650885165983415456218025":
|
Test "atan2 (-0.75, -1.0) == -2.49809154479650885165983415456218025":
|
||||||
float: 1
|
float: 1
|
||||||
ifloat: 1
|
ifloat: 1
|
||||||
|
Test "atan2 (-max_value, -min_value) == -pi/2":
|
||||||
|
float: 1
|
||||||
|
ifloat: 1
|
||||||
Test "atan2 (0.75, -1.0) == 2.49809154479650885165983415456218025":
|
Test "atan2 (0.75, -1.0) == 2.49809154479650885165983415456218025":
|
||||||
float: 1
|
float: 1
|
||||||
ifloat: 1
|
ifloat: 1
|
||||||
|
Loading…
Reference in New Issue
Block a user