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.tar.gz glibc-10285c21134b280457094a6acaa9341862bc65ef.tar.xz glibc-10285c21134b280457094a6acaa9341862bc65ef.zip |
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
diff --git a/ChangeLog b/ChangeLog index f63229275e..f066a88491 100644 --- a/ChangeLog +++ b/ChangeLog @@ -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 diff --git a/NEWS b/NEWS index 91b26448dc..96b351c306 100644 --- a/NEWS +++ b/NEWS @@ -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 */ |