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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么Java中的-Infinity + Infinity的平方根? [重复]相关的知识,希望对你有一定的参考价值。

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

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

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

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

答案

返回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

另一答案

它只是在documentationMath中描述。

对于Math.sqrt

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

对于Math.pow

如果

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

然后结果是正无穷大。

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

以上是关于为什么Java中的-Infinity + Infinity的平方根? [重复]的主要内容,如果未能解决你的问题,请参考以下文章

盘点js中那些诡异的结果

java中的无穷大和无穷小

JSON 省略了 Infinity 和 NaN; ECMAScript 中的 JSON 状态?

JSON 省略了 Infinity 和 NaN; ECMAScript 中的 JSON 状态?

在java中的double和float类型数据相除为啥可以除以零

中科大提出统一输入过滤框架InFi