在g ++版本4.8.0(32位mingw)下,-0.0(二进制表示0x8000000000000000)的平方根为NAN。但我可以发誓早期版本(我不确定哪个,但是我最后一次运行我的完整测试套件)只返回0.0,这对我来说似乎更合理。
这是对的吗? C ++标准中的某些内容是否已更改,或者这是g ++更改?
答案 0 :(得分:9)
这是MinGW环境的非标准*行为(我也间接地通过我所工作的软件意外失败的客户观察到了这一行为。)
您可能已经看到sqrt(-0.)
的正确结果,即-0.
,具有更高的优化级别,其中值是在编译时正确计算的,或者是先前版本的运行时其中没有虫子。
我最终将我自己的“固定”sqrt()
定义为:
double mysqrt(double x) {
if (x == 0.) return x; else return sqrt(x);
}
(*)IEEE 754将sqrt(-0.)
定义为-0.
。 C或C ++编译器不必为浮点运算实现IEEE 754,但GCC会尝试(在此特定情况下,失败)。