12

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

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

4

2 回答 2

3

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

同一标准的 2008 年修订版增加了 pow 函数的定义。根据这个定义,只有当 y 是奇数时,pow(x,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 年之前的历史一无所知。如果有人可以追溯历史,请在此处发表评论。

于 2019-05-20T17:02:00.137 回答
0

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

如果其他人没有击败我,我可能会在我不休假的时候解释更多。

于 2013-10-08T01:26:15.490 回答