diff options
-rw-r--r-- | ChangeLog | 12 | ||||
-rw-r--r-- | math/w_pow.c | 24 | ||||
-rw-r--r-- | math/w_powf.c | 24 | ||||
-rw-r--r-- | math/w_powl.c | 24 | ||||
-rw-r--r-- | sysdeps/ieee754/dbl-64/e_pow.c | 3 | ||||
-rw-r--r-- | sysdeps/ieee754/k_standard.c | 30 |
6 files changed, 29 insertions, 88 deletions
diff --git a/ChangeLog b/ChangeLog index e4a41d6a3c..42a432d6e1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2016-12-02 Joseph Myers <joseph@codesourcery.com> + + [BZ #20919] + * sysdeps/ieee754/dbl-64/e_pow.c (__ieee754_pow): Do not return + NaN first argument when raised to power 0. + * math/w_pow.c (__pow): Do not check for NaN or zero results from + raising to power zero. + * math/w_powf.c (__powf): Likewise. + * math/w_powl.c (__powl): Likewise. + * sysdeps/ieee754/k_standard.c (__kernel_standard): Do not handle + pow (0, 0) or pow (NaN, 0). + 2016-12-02 Carlos O'Donell <carlos@redhat.com> [BZ #20918] diff --git a/math/w_pow.c b/math/w_pow.c index 12c0591d34..ed79dbda05 100644 --- a/math/w_pow.c +++ b/math/w_pow.c @@ -29,13 +29,7 @@ __pow (double x, double y) { if (_LIB_VERSION != _IEEE_) { - if (isnan (x)) - { - if (y == 0.0) - /* pow(NaN,0.0) */ - return __kernel_standard (x, y, 42); - } - else if (isfinite (x) && isfinite (y)) + if (isfinite (x) && isfinite (y)) { if (isnan (z)) /* pow neg**non-int */ @@ -55,19 +49,11 @@ __pow (double x, double y) } } } - else if (__builtin_expect (z == 0.0, 0) && isfinite (x) && isfinite (y) + else if (__builtin_expect (z == 0.0, 0) + && isfinite (x) && x != 0 && isfinite (y) && _LIB_VERSION != _IEEE_) - { - if (x == 0.0) - { - if (y == 0.0) - /* pow(0.0,0.0) */ - return __kernel_standard (x, y, 20); - } - else - /* pow underflow */ - return __kernel_standard (x, y, 22); - } + /* pow underflow */ + return __kernel_standard (x, y, 22); return z; } diff --git a/math/w_powf.c b/math/w_powf.c index 2e786e2f4e..ec157a3a13 100644 --- a/math/w_powf.c +++ b/math/w_powf.c @@ -29,13 +29,7 @@ __powf (float x, float y) { if (_LIB_VERSION != _IEEE_) { - if (isnan (x)) - { - if (y == 0.0f) - /* pow(NaN,0.0) */ - return __kernel_standard_f (x, y, 142); - } - else if (isfinite (x) && isfinite (y)) + if (isfinite (x) && isfinite (y)) { if (isnan (z)) /* pow neg**non-int */ @@ -55,19 +49,11 @@ __powf (float x, float y) } } } - else if (__builtin_expect (z == 0.0f, 0) && isfinite (x) && isfinite (y) + else if (__builtin_expect (z == 0.0f, 0) + && isfinite (x) && x != 0 && isfinite (y) && _LIB_VERSION != _IEEE_) - { - if (x == 0.0f) - { - if (y == 0.0f) - /* pow(0.0,0.0) */ - return __kernel_standard_f (x, y, 120); - } - else - /* pow underflow */ - return __kernel_standard_f (x, y, 122); - } + /* pow underflow */ + return __kernel_standard_f (x, y, 122); return z; } diff --git a/math/w_powl.c b/math/w_powl.c index be02e1eacc..9b86651f55 100644 --- a/math/w_powl.c +++ b/math/w_powl.c @@ -29,13 +29,7 @@ __powl (long double x, long double y) { if (_LIB_VERSION != _IEEE_) { - if (isnan (x)) - { - if (y == 0.0L) - /* pow(NaN,0.0) */ - return __kernel_standard_l (x, y, 242); - } - else if (isfinite (x) && isfinite (y)) + if (isfinite (x) && isfinite (y)) { if (isnan (z)) /* pow neg**non-int */ @@ -55,19 +49,11 @@ __powl (long double x, long double y) } } } - else if (__builtin_expect (z == 0.0L, 0) && isfinite (x) && isfinite (y) + else if (__builtin_expect (z == 0.0L, 0) + && isfinite (x) && x != 0 && isfinite (y) && _LIB_VERSION != _IEEE_) - { - if (x == 0.0L) - { - if (y == 0.0L) - /* pow(0.0,0.0) */ - return __kernel_standard_l (x, y, 220); - } - else - /* pow underflow */ - return __kernel_standard_l (x, y, 222); - } + /* pow underflow */ + return __kernel_standard_l (x, y, 222); return z; } diff --git a/sysdeps/ieee754/dbl-64/e_pow.c b/sysdeps/ieee754/dbl-64/e_pow.c index bd758b5979..db6ecf76e5 100644 --- a/sysdeps/ieee754/dbl-64/e_pow.c +++ b/sysdeps/ieee754/dbl-64/e_pow.c @@ -73,7 +73,8 @@ __ieee754_pow (double x, double y) { /* of y */ qx = u.i[HIGH_HALF] & 0x7fffffff; /* Is x a NaN? */ - if (((qx == 0x7ff00000) && (u.i[LOW_HALF] != 0)) || (qx > 0x7ff00000)) + if ((((qx == 0x7ff00000) && (u.i[LOW_HALF] != 0)) || (qx > 0x7ff00000)) + && y != 0) return x; if (y == 1.0) return x; diff --git a/sysdeps/ieee754/k_standard.c b/sysdeps/ieee754/k_standard.c index c8aebbff90..b100b3e351 100644 --- a/sysdeps/ieee754/k_standard.c +++ b/sysdeps/ieee754/k_standard.c @@ -60,7 +60,6 @@ static double zero = 0.0; /* used as const */ * 17-- log(x<0) * 18-- log10(0) * 19-- log10(x<0) - * 20-- pow(0.0,0.0) * 21-- pow(x,y) overflow * 22-- pow(x,y) underflow * 23-- pow(0,negative) @@ -82,7 +81,6 @@ static double zero = 0.0; /* used as const */ * 39-- yn(x>X_TLOSS, n) * 40-- tgamma(finite) overflow * 41-- tgamma(-integer) - * 42-- pow(NaN,0.0) * 43-- +0**neg * 44-- exp2 overflow * 45-- exp2 underflow @@ -461,20 +459,6 @@ __kernel_standard(double x, double y, int type) __set_errno (EDOM); } break; - case 20: - case 120: - case 220: - /* pow(0.0,0.0) */ - /* error only if _LIB_VERSION == _SVID_ */ - exc.type = DOMAIN; - exc.name = CSTR ("pow"); - exc.retval = zero; - if (_LIB_VERSION != _SVID_) exc.retval = 1.0; - else if (!matherr(&exc)) { - (void) WRITE2("pow(0,0): DOMAIN error\n", 23); - __set_errno (EDOM); - } - break; case 21: case 121: case 221: @@ -845,20 +829,6 @@ __kernel_standard(double x, double y, int type) __set_errno (EDOM); } break; - case 42: - case 142: - case 242: - /* pow(NaN,0.0) */ - /* error only if _LIB_VERSION == _SVID_ & _XOPEN_ */ - exc.type = DOMAIN; - exc.name = CSTR ("pow"); - exc.retval = x; - if (_LIB_VERSION == _IEEE_ || - _LIB_VERSION == _POSIX_) exc.retval = 1.0; - else if (!matherr(&exc)) { - __set_errno (EDOM); - } - break; case 44: case 144: |