add cp866 (dos cyrillic) to iconv
[musl] / src / math / pow.c
index ac3abc0..3ddc1b6 100644 (file)
@@ -125,11 +125,11 @@ double pow(double x, double y)
                else if (iy >= 0x3ff00000) {
                        k = (iy>>20) - 0x3ff;  /* exponent */
                        if (k > 20) {
-                               j = ly>>(52-k);
+                               uint32_t j = ly>>(52-k);
                                if ((j<<(52-k)) == ly)
                                        yisint = 2 - (j&1);
                        } else if (ly == 0) {
-                               j = iy>>(20-k);
+                               uint32_t j = iy>>(20-k);
                                if ((j<<(20-k)) == iy)
                                        yisint = 2 - (j&1);
                        }
@@ -143,11 +143,23 @@ double pow(double x, double y)
                                return 1.0;
                        else if (ix >= 0x3ff00000) /* (|x|>1)**+-inf = inf,0 */
                                return hy >= 0 ? y : 0.0;
-                       else if ((ix|lx) != 0)     /* (|x|<1)**+-inf = 0,inf if x!=0 */
+                       else                       /* (|x|<1)**+-inf = 0,inf */
                                return hy >= 0 ? 0.0 : -y;
                }
-               if (iy == 0x3ff00000)    /* y is +-1 */
-                       return hy >= 0 ? x : 1.0/x;
+               if (iy == 0x3ff00000) {    /* y is +-1 */
+                       if (hy >= 0)
+                               return x;
+                       y = 1/x;
+#if FLT_EVAL_METHOD!=0
+                       {
+                               union {double f; uint64_t i;} u = {y};
+                               uint64_t i = u.i & -1ULL/2;
+                               if (i>>52 == 0 && (i&(i-1)))
+                                       FORCE_EVAL((float)y);
+                       }
+#endif
+                       return y;
+               }
                if (hy == 0x40000000)    /* y is 2 */
                        return x*x;
                if (hy == 0x3fe00000) {  /* y is 0.5 */