From: Joseph Myers Date: Fri, 15 Jun 2012 11:27:51 +0000 (+0000) Subject: Fix pow (0.0, -Inf) (bug 14241). X-Git-Tag: glibc-2.16-tps~38 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=10285c21134b280457094a6acaa9341862bc65ef;p=thirdparty%2Fglibc.git Fix pow (0.0, -Inf) (bug 14241). --- 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 */