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

标签 java math floating-point ieee-754

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

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

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

最佳答案

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

因此行为

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 .

关于java - 为什么 Java 中 -Infinity +Infinity 的平方根是平方根?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48020069/

相关文章:

math - 网格中的矩形 - 我需要有关边缘情况的帮助

c++ - 任意精度小数运算中的 float 与有理数 (C/C++)

python - 属性 lat 必须是显示在我的仪表板中的 float

java - 如何保留Lucene索引而不删除文档

java - 使用什么编程语言来开发Java?

math - 掌握 GIS 数学,从哪里开始?

javascript - 测量三 Angular 形面对光线的程度

C中带有 float 的现金分配错误

java - 创建 Spring MVC 应用程序

java - org.XML.sax.SAXParseException : Unexpected token (position:TEXT @1:2 in java. io.StringReader@959e0aa)