为什么Java中的-Infinity + Infinity的平方根? [重复]

问题描述 投票:35回答:2

这个问题在这里已有答案:

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

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

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

java math floating-point ieee-754
2个回答
48
投票

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

这样的行为

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

指定是因为已知(容易且快速)已生成未定义的值;完全基于论证的标志。

但是评价表达方式

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

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

有关IEEE 754标准背后的一些推理的其他详细信息,包括返回标志值而不是生成异常的原因,可在

What Every Computer Scientist Should Know About Floating-Point Arithmetic (1991, David Goldberg)

这是附录D.

Sun Microsystems Numerical Computation Guide


30
投票

它只是在documentationMath中描述。

对于Math.sqrt

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

对于Math.pow

如果

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

然后结果是正无穷大。

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

© www.soinside.com 2019 - 2024. All rights reserved.