X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Fmath%2Fpow.c;h=3ddc1b6ff8ebfd0266e70fc9bd3cb372303a9df0;hb=68a5a23abcb9649f05728db4cf50bb4498937855;hp=ac3abc0fdbb81b4d4d4f082ac62f6521a920e6cb;hpb=f29fea00b5bc72d4b8abccba2bb1e312684d1fce;p=musl diff --git a/src/math/pow.c b/src/math/pow.c index ac3abc0f..3ddc1b6f 100644 --- a/src/math/pow.c +++ b/src/math/pow.c @@ -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 */