Floating point 负零的平方根

Floating point 负零的平方根,floating-point,g++4.8,Floating Point,G++4.8,在g++版本4.8.0(32位mingw)下,-0.0(二进制表示0x80000000000000)的平方根为NAN。但我可以发誓,早期版本(我不确定是哪一个,但上次我运行完整的测试套件时)只返回了0.0,这对我来说似乎更合理 是这样吗?在C++标准中有什么改变了,或者这是G+改变?< /P> < P>这是MIWW环境的非标准*行为(我也间接地通过我所处理的软件的客户意外地观察到)。 您可能已经看到了sqrt(-0.)的正确结果,即-0.,具有更高的优化级别,其中在编译时正确计算了值,或者具有先

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


是这样吗?在C++标准中有什么改变了,或者这是G+改变?< /P> < P>这是MIWW环境的非标准*行为(我也间接地通过我所处理的软件的客户意外地观察到)。 您可能已经看到了
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试图(在这个特定的实例中失败)。我认为GCC只是编译器和链接器,而不是所有的标准库设施。GCC文档说用户必须提供一些图书馆设施。因此,GCC不会尝试提供
sqrt
,因此它不会无法为
sqrt(-0.)生成正确的结果。在MinGW中,库来自Windows环境。from:“GCC不提供托管实现所需的库设施,也不提供C99所需的独立实现的所有设施;要使用托管环境的设施,您需要在其他地方找到它们(例如,在GNU C库中)。”谢谢你!我开始怀疑我是否想象过早期的行为。你知道在1/sqrt(x)为负值的情况下,x的值有什么道理吗?在我看来,IEEE754应该平衡数学准确性、易实现性和易使用性;它的大多数设计决策至少支持其中一个。让1/sqrt(negZero)返回negZero似乎并不特别适合任何情况。@supercat我没有解释。我怀疑在某个地方潜藏着威廉·卡汉(William Kahan)的一篇激烈的文章,关于如何延长
-0中的
sqrt()
沿其切线简化这样或那样的数值算法。请注意,IEEE 754为
pow()
定义的特殊情况更简单。