将sqrt(-0.0)定义为-0.0,简化了哪种数值算法?

Pas*_*uoq 12 floating-point ieee-754

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

是否存在特定的数值算法,其中sqrt(-0.0)定义为-0.0简化算法本身的逻辑?

Ste*_*non 0

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

如果其他人不比我先一步的话,我可以在不度假的时候解释更多。

  • 这实在是一个没有答案的问题。在哪些表达式中 -0 约定更有意义? (4认同)
  • @PascalCuoq:奇怪的是,Kahan 的符号位文章让我相信“sqrt(-0.0)”为“0.0”会更有意义,以便与 Kahan 定义复数平方根的方式保持一致。如果我没看错的话,CSQRT 调用的结果(在有限输入上)总是有一个其符号位未设置的实部。(我相信这也是 C99 附录 G 推荐的行为。)IOW,CSQRT 始终将象限 1 和 2 映射到象限 1,将象限 3 和 4 映射到象限 4。(使用零的符号来确定象限中的象限成员资格)明显的方式。) (4认同)
  • @pburka 示例在文章“Elementary Functions or Much Ado About Nothing's Sign Bit”中,Stephen 在这个问题之前指出的权威参考是 StackOverflow 问题:http://people.freebsd.org/~das/kahan86branch.pdf 。正如他所说,确切的细节超出了“编程”的范围。至少在 `sqrt(-0.0)` 的情况下,程序员应该“不要将 +0 和 -0 视为不同的数值,而应将它们的符号位视为传达一位信息的辅助变量(或错误信息)”,并相信数学家这是有道理的 (3认同)