Per IEEE754r, pow(1, y) is 1 even if y is NaN, and pow(-1, +-Inf) is 1.
MFC after: 2 weeks
This commit is contained in:
parent
741ae1d017
commit
cd24d79843
@ -109,6 +109,9 @@ __ieee754_pow(double x, double y)
|
||||
/* y==zero: x**0 = 1 */
|
||||
if((iy|ly)==0) return one;
|
||||
|
||||
/* x==1: 1**y = 1, even if y is NaN */
|
||||
if (hx==0x3ff00000 && lx == 0) return one;
|
||||
|
||||
/* y!=zero: result is NaN if either arg is NaN */
|
||||
if(ix > 0x7ff00000 || ((ix==0x7ff00000)&&(lx!=0)) ||
|
||||
iy > 0x7ff00000 || ((iy==0x7ff00000)&&(ly!=0)))
|
||||
@ -138,7 +141,7 @@ __ieee754_pow(double x, double y)
|
||||
if(ly==0) {
|
||||
if (iy==0x7ff00000) { /* y is +-inf */
|
||||
if(((ix-0x3ff00000)|lx)==0)
|
||||
return y - y; /* inf**+-1 is NaN */
|
||||
return one; /* (-1)**+-inf is NaN */
|
||||
else if (ix >= 0x3ff00000)/* (|x|>1)**+-inf = inf,0 */
|
||||
return (hy>=0)? y: zero;
|
||||
else /* (|x|<1)**-,+inf = inf,0 */
|
||||
|
@ -67,6 +67,9 @@ __ieee754_powf(float x, float y)
|
||||
/* y==zero: x**0 = 1 */
|
||||
if(iy==0) return one;
|
||||
|
||||
/* x==1: 1**y = 1, even if y is NaN */
|
||||
if (hx==0x3f800000) return one;
|
||||
|
||||
/* y!=zero: result is NaN if either arg is NaN */
|
||||
if(ix > 0x7f800000 ||
|
||||
iy > 0x7f800000)
|
||||
@ -90,7 +93,7 @@ __ieee754_powf(float x, float y)
|
||||
/* special value of y */
|
||||
if (iy==0x7f800000) { /* y is +-inf */
|
||||
if (ix==0x3f800000)
|
||||
return y - y; /* inf**+-1 is NaN */
|
||||
return one; /* (-1)**+-inf is NaN */
|
||||
else if (ix > 0x3f800000)/* (|x|>1)**+-inf = inf,0 */
|
||||
return (hy>=0)? y: zero;
|
||||
else /* (|x|<1)**-,+inf = inf,0 */
|
||||
|
Loading…
x
Reference in New Issue
Block a user