aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog12
-rw-r--r--math/w_pow.c24
-rw-r--r--math/w_powf.c24
-rw-r--r--math/w_powl.c24
-rw-r--r--sysdeps/ieee754/dbl-64/e_pow.c3
-rw-r--r--sysdeps/ieee754/k_standard.c30
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: