Fix pow (0.0, -Inf) (bug 14241).

This commit is contained in:
Joseph Myers 2012-06-15 11:27:51 +00:00
parent 06c5abbdf8
commit 10285c2113
4 changed files with 13 additions and 3 deletions

View File

@ -1,3 +1,11 @@
2012-06-15 Joseph Myers <joseph@codesourcery.com>
[BZ #14241]
* sysdeps/ieee754/dbl-64/e_pow.c (__ieee754_pow): Use 0.0 instead
of ABS(x) in calculating zero to negative powers other than odd
integers.
* math/libm-test.inc (pow_test): Add more tests.
2012-06-15 Andreas Jaeger <aj@suse.de> 2012-06-15 Andreas Jaeger <aj@suse.de>
* manual/contrib.texi (Contributors): Update entry of Liubov * manual/contrib.texi (Contributors): Update entry of Liubov

2
NEWS
View File

@ -29,7 +29,7 @@ Version 2.16
13963, 13967, 13968, 13970, 13973, 13979, 13983, 13986, 13996, 14012, 13963, 13967, 13968, 13970, 13973, 13979, 13983, 13986, 13996, 14012,
14027, 14033, 14034, 14036, 14040, 14043, 14044, 14048, 14049, 14053, 14027, 14033, 14034, 14036, 14040, 14043, 14044, 14048, 14049, 14053,
14055, 14059, 14064, 14075, 14080, 14083, 14103, 14104, 14109, 14112, 14055, 14059, 14064, 14075, 14080, 14083, 14103, 14104, 14109, 14112,
14122, 14123, 14134, 14153, 14183, 14188, 14199, 14210, 14218 14122, 14123, 14134, 14153, 14183, 14188, 14199, 14210, 14218, 14241
* Support for the x32 ABI on x86-64 added. The x32 target is selected by * Support for the x32 ABI on x86-64 added. The x32 target is selected by
configuring glibc with: configuring glibc with:

View File

@ -6290,6 +6290,8 @@ pow_test (void)
TEST_ff_f (pow, minus_zero, 11.1L, 0); TEST_ff_f (pow, minus_zero, 11.1L, 0);
TEST_ff_f (pow, 0, plus_infty, 0); TEST_ff_f (pow, 0, plus_infty, 0);
TEST_ff_f (pow, minus_zero, plus_infty, 0); TEST_ff_f (pow, minus_zero, plus_infty, 0);
TEST_ff_f (pow, 0, minus_infty, plus_infty, DIVIDE_BY_ZERO_EXCEPTION_OK);
TEST_ff_f (pow, minus_zero, minus_infty, plus_infty, DIVIDE_BY_ZERO_EXCEPTION_OK);
#ifndef TEST_INLINE #ifndef TEST_INLINE
/* pow (x, +inf) == +inf for |x| > 1. */ /* pow (x, +inf) == +inf for |x| > 1. */

View File

@ -112,12 +112,12 @@ __ieee754_pow(double x, double y) {
if (((v.i[HIGH_HALF] & 0x7fffffff) == 0x7ff00000 && v.i[LOW_HALF] != 0) if (((v.i[HIGH_HALF] & 0x7fffffff) == 0x7ff00000 && v.i[LOW_HALF] != 0)
|| (v.i[HIGH_HALF] & 0x7fffffff) > 0x7ff00000) || (v.i[HIGH_HALF] & 0x7fffffff) > 0x7ff00000)
return y; return y;
if (ABS(y) > 1.0e20) return (y>0)?0:1.0/ABS(x); if (ABS(y) > 1.0e20) return (y>0)?0:1.0/0.0;
k = checkint(y); k = checkint(y);
if (k == -1) if (k == -1)
return y < 0 ? 1.0/x : x; return y < 0 ? 1.0/x : x;
else else
return y < 0 ? 1.0/ABS(x) : 0.0; /* return 0 */ return y < 0 ? 1.0/0.0 : 0.0; /* return 0 */
} }
qx = u.i[HIGH_HALF]&0x7fffffff; /* no sign */ qx = u.i[HIGH_HALF]&0x7fffffff; /* no sign */