在 g++ 版本 4.8.0(32 位 mingw)下,-0.0(二进制表示形式 0x8000000000000000)的平方根为 NAN。但我可以发誓早期版本(我不确定是哪个,但我最后一次运行完整的测试套件)返回的只是 0.0,这对我来说似乎更明智。
这是正确的吗?C++ 标准中的某些内容是否发生了变化,或者这是 g++ 的变化?
在 g++ 版本 4.8.0(32 位 mingw)下,-0.0(二进制表示形式 0x8000000000000000)的平方根为 NAN。但我可以发誓早期版本(我不确定是哪个,但我最后一次运行完整的测试套件)返回的只是 0.0,这对我来说似乎更明智。
这是正确的吗?C++ 标准中的某些内容是否发生了变化,或者这是 g++ 的变化?
这是 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 会尝试(在此特定情况下,失败)。