about summary refs log tree commit diff
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: