diff options
author | Joseph Myers <joseph@codesourcery.com> | 2012-06-15 11:27:51 +0000 |
---|---|---|
committer | Joseph Myers <joseph@codesourcery.com> | 2012-06-15 11:27:51 +0000 |
commit | 10285c21134b280457094a6acaa9341862bc65ef (patch) | |
tree | 66569a906f5b11ca2d9bcb5f15c8f6d48e4019a5 | |
parent | 06c5abbdf81660d1ca99a3b4467f91fb9bca84dd (diff) | |
download | glibc-10285c21134b280457094a6acaa9341862bc65ef.zip glibc-10285c21134b280457094a6acaa9341862bc65ef.tar.gz glibc-10285c21134b280457094a6acaa9341862bc65ef.tar.bz2 |
Fix pow (0.0, -Inf) (bug 14241).
-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 d32dde3..8e4d02e 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 6c41af9..3fd5e65 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 */ |