为什么在Java中-Infinity +Infinity的平方根?

2022-09-01 05:44:49

我尝试了两种不同的方法来查找Java中的平方根:

Math.sqrt(Double.NEGATIVE_INFINITY); // NaN
Math.pow(Double.NEGATIVE_INFINITY, 0.5); // Infinity

为什么第二种方式不返回预期的答案(与第一种方式相同)?NaN


答案 1

返回NaN(根据IEEE 754),以便在获得真正未定义的(中间)结果时继续计算。返回无穷大,以便在发生溢出后继续计算。

因此,行为

Math.sqrt(Double.NEGATIVE_INFINITY); // NaN

之所以指定,是因为已知(轻松快速地)已生成未定义的值;仅基于参数的符号。

但是表达式的计算

Math.pow(Double.NEGATIVE_INFINITY, 0.5); // Infinity

遇到溢出和无效操作。然而,无效操作识别严重依赖于第二个参数的确定的准确性。如果第二个参数是先前舍入操作的结果,则它可能不完全 0.5。因此,返回不太严重的确定,即对溢出的识别,以避免结果对第二个参数的准确性的严重依赖。

有关 IEEE 754 标准背后的一些推理的更多详细信息,包括返回标志值而不是生成异常背后的原因,请参阅

每个计算机科学家都应该知道的浮点算术(1991年,大卫戈德堡)

这是 附录 D

太阳微系统数值计算指南


答案 2

它只是按照 文档中描述的方式运行。Math

为:Math.sqrt

如果参数为 NaN 或小于零,则结果为 NaN。

为:Math.pow

如果

  • 第一个参数为负零,第二个参数小于零但不是有限奇数,或者
  • 第一个参数为负无穷大,第二个参数大于零但不是有限奇数,

则结果为正无穷大。

至于他们为什么做出这样的设计选择 - 你必须问问java的作者。