diff options
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | NEWS | 2 | ||||
-rw-r--r-- | math/libm-test.inc | 2 | ||||
-rw-r--r-- | sysdeps/ieee754/dbl-64/e_pow.c | 4 |
4 files changed, 13 insertions, 3 deletions
@@ -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> * manual/contrib.texi (Contributors): Update entry of Liubov @@ -29,7 +29,7 @@ Version 2.16 13963, 13967, 13968, 13970, 13973, 13979, 13983, 13986, 13996, 14012, 14027, 14033, 14034, 14036, 14040, 14043, 14044, 14048, 14049, 14053, 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 configuring glibc with: diff --git a/math/libm-test.inc b/math/libm-test.inc index d32dde34a5..8e4d02e76a 100644 --- a/math/libm-test.inc +++ b/math/libm-test.inc @@ -6290,6 +6290,8 @@ pow_test (void) TEST_ff_f (pow, minus_zero, 11.1L, 0); TEST_ff_f (pow, 0, 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 /* pow (x, +inf) == +inf for |x| > 1. */ diff --git a/sysdeps/ieee754/dbl-64/e_pow.c b/sysdeps/ieee754/dbl-64/e_pow.c index 6c41af93ba..3fd5e6507f 100644 --- a/sysdeps/ieee754/dbl-64/e_pow.c +++ b/sysdeps/ieee754/dbl-64/e_pow.c @@ -112,12 +112,12 @@ __ieee754_pow(double x, double y) { if (((v.i[HIGH_HALF] & 0x7fffffff) == 0x7ff00000 && v.i[LOW_HALF] != 0) || (v.i[HIGH_HALF] & 0x7fffffff) > 0x7ff00000) 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); if (k == -1) return y < 0 ? 1.0/x : x; 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 */ |