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

Why in Java pow(1, qNaN) is qNaN while in IEEE 754-2008 pow(1, qNaN) is 1?

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

Java:

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) is 1 for any y (even a quiet NaN)

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

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

Returns the value of the first argument raised to the power of the second argument. Special cases:

  • If the second argument is positive or negative zero, then the result is 1.0.
  • If the second argument is 1.0, then the result is the same as the first argument.
  • If the second argument is NaN, then the result is NaN.
  • ....

至于为什么是这样规定的,我建议最好问问规定的人


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

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

"[Clause 9] is new; it recommends fifty operations, including log, power, and trigonometric functions, that language standards should define.

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

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

注:我只是推断这个推理。 AFAIK,实际推理尚未公布。