为什么在 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,实际推理尚未公布。
为什么在 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,实际推理尚未公布。