为什么在Java中pow(1,qNaN)是qNaN而在IEEE754-2008pow(1,qNaN)中是1?

为什么在 Java 中pow(1, qNaN)qNaN而在 IEEE 754 中pow(1, qNaN)1

爪哇:

System.out.println(Math.pow(1, Double.NaN)); // prints NaN (which is qNaN)

$ javac --version
javac 11.0.11

IEEE 754-2008, 9.2.1 特殊值:

pow (+1, y) 对于任何 y 都是 1(即使是安静的 NaN)

回答

之所以这样,是因为javadoc for 将其Math.pow指定为如此。它说:

public static double pow?(double a, double b)

返回第一个参数的第二个参数的幂的值。特别案例:

  • 如果第二个参数是正零或负零,则结果为 1.0。
  • 如果第二个参数为 1.0,则结果与第一个参数相同。
  • 如果第二个参数为 NaN,则结果为 NaN。
  • ....

至于为什么以这种方式指定,我能建议的最好方法是询问指定它的人。


更新- 经过一些进一步的研究,我现在可以解释这种分歧。

Java 发布时,IEEE 754 的发布版本是 1985 年的版本。2008 年,发布了 754 规范的主要修订版。根据维基百科的IEEE 754-2008 页面:

“[第 9 条] 是新的;它推荐了 50 种运算,包括对数、幂和三角函数,这些都是语言标准应该定义的。

但是,Java 的设计者Math.pow至少在 10 年前就已经设计并实现了 Java 的功能,并且他们选择NaN按照自己的想法来实现该行为。他们的想法与 IEEE 754-2008 标准委员会的想法不同。

幸运的是,IEEE 754-2008 声明第 9 条是可选的,并且不是标准一致性所必需的。因此,Java 设计人员采取了对现有 Java 开发人员干扰最小的路线,并决定不更改pow语义以匹配 2008 标准。(我认为这是正确的决定。)

注意:我只是推断这个推理。AFAIK,实际推理尚未发表。

  • There are two schools of thought for how NaN affects the result, as explained in the [Function definition](https://en.wikipedia.org/wiki/NaN#Function_definition) section of the [NaN](https://en.wikipedia.org/wiki/NaN) article on Wikipedia: 1) E.g. `pow(1, y)` is always 1, even if `y` is NaN. 2) Any operation involving NaN results in NaN. --- As the article says, the 2008 standard defines `pow(...)` to follow #1, and `powr(...)` to follow #2, so we can conclude that `Math.pow(...)` is the implementation of IEEE 754-2008 `powr(...)`, and that can't change, for backwards-compatibility reasons.

以上是为什么在Java中pow(1,qNaN)是qNaN而在IEEE754-2008pow(1,qNaN)中是1?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>