提交 cb5c057c 编写于 作者: S Szabolcs Nagy 提交者: Rich Felker

math: fix pow(+-0,-inf) not to raise divbyzero flag

this reverts the commit f29fea00
which was based on a bug in C99 and POSIX and did not match IEEE-754
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1515.pdf
上级 1b1cafa5
...@@ -143,7 +143,7 @@ double pow(double x, double y) ...@@ -143,7 +143,7 @@ double pow(double x, double y)
return 1.0; return 1.0;
else if (ix >= 0x3ff00000) /* (|x|>1)**+-inf = inf,0 */ else if (ix >= 0x3ff00000) /* (|x|>1)**+-inf = inf,0 */
return hy >= 0 ? y : 0.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; return hy >= 0 ? 0.0 : -y;
} }
if (iy == 0x3ff00000) { /* y is +-1 */ if (iy == 0x3ff00000) { /* y is +-1 */
......
...@@ -90,7 +90,7 @@ float powf(float x, float y) ...@@ -90,7 +90,7 @@ float powf(float x, float y)
return 1.0f; return 1.0f;
else if (ix > 0x3f800000) /* (|x|>1)**+-inf = inf,0 */ else if (ix > 0x3f800000) /* (|x|>1)**+-inf = inf,0 */
return hy >= 0 ? y : 0.0f; return hy >= 0 ? y : 0.0f;
else if (ix != 0) /* (|x|<1)**+-inf = 0,inf if x!=0 */ else /* (|x|<1)**+-inf = 0,inf */
return hy >= 0 ? 0.0f: -y; return hy >= 0 ? 0.0f: -y;
} }
if (iy == 0x3f800000) /* y is +-1 */ if (iy == 0x3f800000) /* y is +-1 */
......
...@@ -227,7 +227,7 @@ long double powl(long double x, long double y) ...@@ -227,7 +227,7 @@ long double powl(long double x, long double y)
if (y <= -LDBL_MAX) { if (y <= -LDBL_MAX) {
if (x > 1.0 || x < -1.0) if (x > 1.0 || x < -1.0)
return 0.0; return 0.0;
if (x != 0.0) if (x != 0.0 || y == -INFINITY)
return INFINITY; return INFINITY;
} }
if (x >= LDBL_MAX) { if (x >= LDBL_MAX) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册