From 10285c21134b280457094a6acaa9341862bc65ef Mon Sep 17 00:00:00 2001 From: Joseph Myers Date: Fri, 15 Jun 2012 11:27:51 +0000 Subject: [PATCH] Fix pow (0.0, -Inf) (bug 14241). --- ChangeLog | 8 ++++++++ NEWS | 2 +- math/libm-test.inc | 2 ++ sysdeps/ieee754/dbl-64/e_pow.c | 4 ++-- 4 files changed, 13 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index f63229275e6..f066a88491b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2012-06-15 Joseph Myers + + [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 * manual/contrib.texi (Contributors): Update entry of Liubov diff --git a/NEWS b/NEWS index 91b26448dcd..96b351c3061 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 d32dde34a54..8e4d02e76a1 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 6c41af93ba4..3fd5e6507f0 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 */ -- 2.47.2