负零的平方根

时间:2013-10-07 18:38:55

标签: floating-point g++4.8

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

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

1 个答案:

答案 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会尝试(在此特定情况下,失败)。