8

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

这是正确的吗?C++ 标准中的某些内容是否发生了变化,或者这是 g++ 的变化?

4

1 回答 1

9

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

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

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

double mysqrt(double x) {
  if (x == 0.) return x; else return sqrt(x);
}

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

于 2013-10-07T18:43:44.023 回答