负零的平方根

Ton*_*nyK 8 floating-point g++4.8

在g ++版本4.8.0(32位mingw)下,-0.0(二进制表示0x8000000000000000)的平方根为NAN.但是我可以发誓早期版本(我不确定哪个,但是我最后一次运行我的完整测试套件)只返回0.0,这对我来说似乎更明智.

这是正确的吗?C++标准中的某些内容是否已更改,或者这是一个g ++更改?

Pas*_*uoq 9

这是MinGW环境的非标准*行为(我也间接地通过我所工作的软件意外失败的客户观察到).

您可能已经看到了正确的结果sqrt(-0.),即-0.,在编译时正确计算值的更高优化级别,或者没有错误的运行时的先前版本.

我最终将自己的"固定"定义sqrt()为:

double mysqrt(double x) {
  if (x == 0.) return x; else return sqrt(x);
}
Run Code Online (Sandbox Code Playgroud)

(*)IEEE 754定义sqrt(-0.)-0..AC或C++编译器不必为浮点运算实现IEEE 754,但GCC尝试(在此特定情况下,失败).