Floating point 通过将sqrt(-0.0)定义为-0.0,简化了什么数值算法?

Floating point 通过将sqrt(-0.0)定义为-0.0,简化了什么数值算法?,floating-point,ieee-754,Floating Point,Ieee 754,IEEE 754标准将负零的平方根定义为负零。这个选择很容易合理化,但是其他选择,例如将sqrt(-0.0)定义为NaN,也可以合理化,并且更容易在硬件中实现。如果担心程序员会编写如果(x>=0.0),那么sqrt(x)else 0.0,当x为-0.0时,就会被这个表达式咬到NaN,那么sqrt(-0.0)可以被定义为+0.0(实际上,对于这个特定表达式,结果会更加一致) 在sqrt(-0.0)的情况下,是否有特别的数值算法定义为-0.0简化了算法本身的逻辑?唯一数学上合理的结果是0。有一个合理

IEEE 754标准将负零的平方根定义为负零。这个选择很容易合理化,但是其他选择,例如将
sqrt(-0.0)
定义为
NaN
,也可以合理化,并且更容易在硬件中实现。如果担心程序员会编写
如果(x>=0.0),那么sqrt(x)else 0.0
,当
x
-0.0
时,就会被这个表达式咬到
NaN
,那么
sqrt(-0.0)
可以被定义为
+0.0
(实际上,对于这个特定表达式,结果会更加一致)


sqrt(-0.0)的情况下,是否有特别的数值算法
定义为
-0.0
简化了算法本身的逻辑?

唯一数学上合理的结果是0。有一个合理的问题是它应该是+0还是-0。对于大多数计算来说,它没有任何区别,但对于某些特定的复杂表达式,其结果在特定条件下更有意义0约定。确切的细节不在本网站的范围之内,但这是它的要点


如果其他人没有抢先一步,我可以在我不休假的时候再解释一些。

1985年的官方浮点标准(IEEE标准754-1985)中定义sqrt(-0.0)=-0.0

同一标准的2008年修订版增加了pow函数的定义。根据该定义,pow(x,y)只有在y是奇数整数时才可以有负号。因此,pow(-0.0,3.0)=-0.0。而pow(-0.0,0.5)=+0.0。2008年,改变sqrt(-0.0)的定义为时已晚因此,我们有一个不幸的情况,这两个函数给出了不同的结果

零的符号通常不重要,因为零和负零是相等的。但是当你除以它时,它很重要。所以1/sqrt(-0.0)给出-INF,而pow(-0.0,-0.5)给出+INF


1985年的决定可能只是对现状的观察。1980年的英特尔数学协处理器8087在硬件上实现了sqrt,并给出了sqrt(-0.0)=-0.0。今天,所有的PC处理器都在硬件中实现了sqrt,因此很难改变标准。问题并不重要,值得制作两个不同的sqrt函数,只为负零。我对1980年之前的历史一无所知。如果有人能追溯到更远的历史请在此处发表评论。

这很不错。你可能应该在math上问这个问题。这真的是个不确定的答案。什么是-0约定更有意义的表达式?@pburka示例在文章“基本函数或关于零符号位的许多麻烦”中,Stephen在这个问题之前指出的权威参考是StackOverflow问题:。正如他所说,确切的细节超出了“编程”的范围。程序员应该,至少在
sqrt(-0.0)
的情况下,“与其将+0和-0视为不同的数值,不如将它们的符号位视为传递一位信息(或错误信息)的辅助变量”,并相信它所产生的数学家sense@PascalCuoq:奇怪的是,Kahan的符号位文章让我相信
sqrt(-0.0)
being
0.0
会更有意义,因为Kahan定义复数平方根的方式是一致的。如果我读对了,CSQRT调用(在有限输入上)的结果总是有一个符号位未设置的实部。(我相信这也是C99附录G建议的行为。)综上所述,CSQRT总是将象限1和2映射到象限1,将象限3和4映射到象限4。(使用零的符号以明显的方式确定象限成员身份。)