Author: das
Date: Mon Jan  9 04:58:02 2012
New Revision: 229844
URL: http://svn.freebsd.org/changeset/base/229844

Log:
  MFC r226595:
    Per IEEE754r, pow(1, y) is 1 even if y is NaN, and pow(-1, +-Inf) is 1.

Modified:
  stable/8/lib/msun/src/e_pow.c
  stable/8/lib/msun/src/e_powf.c
Directory Properties:
  stable/8/lib/msun/   (props changed)

Modified: stable/8/lib/msun/src/e_pow.c
==============================================================================
--- stable/8/lib/msun/src/e_pow.c       Mon Jan  9 04:57:59 2012        
(r229843)
+++ stable/8/lib/msun/src/e_pow.c       Mon Jan  9 04:58:02 2012        
(r229844)
@@ -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 */

Modified: stable/8/lib/msun/src/e_powf.c
==============================================================================
--- stable/8/lib/msun/src/e_powf.c      Mon Jan  9 04:57:59 2012        
(r229843)
+++ stable/8/lib/msun/src/e_powf.c      Mon Jan  9 04:58:02 2012        
(r229844)
@@ -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 */
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to