Math.pow
的 ECMAScript 规范有以下特殊规则:
- If x < 0 and x is finite and y is finite and y is not an integer, the result is NaN.
( http://es5.github.com/#x15.8.2.13 )
结果 Math.pow(-8, 1/3)
给出 NaN
而不是 -2
这条规则的原因是什么?该规则是否有某种更广泛的计算机科学或 IEEEish 原因,或者它只是 TC39/Eich 曾经做出的选择?
更新
感谢 Amadan 与我的交流,我想我现在明白其中的道理了。为了后代,我想扩展我们的讨论。
让我们来看下面的例子:Math.pow(823543, 1/7)
产生 6.999999999999999
尽管它确实应该是 7
。这是由于 1/7
必须首先转换为十进制表示形式 0.14285714285714285
而引入的错误,它被 chop 并失去精度。当我们处理正数时,这不是一个糟糕的问题,因为我们仍然得到非常接近真实结果的结果。
然而,一旦我们踏入负面世界,我们就会遇到问题。如果 JavaScript 引擎尝试计算 Math.pow(-823543, 1/7)
,它首先需要将 1/7
转换为小数,因此它会真正在计算 Math.pow(-823543, 0.14285714285714285)
实际上没有真正的答案。在这种情况下,它可能必须返回 NaN
,因为它找不到实数,即使真正的答案应该是 -7
。此外,寻找接近实数的复数以做出“最佳猜测”可能涉及一定程度的复杂性,他们不希望在数学领域需要 JS 引擎。
我的猜测是由于考虑到 float 的精度损失,导致他们制定了负数的非整数幂应该始终为 NaN
的规则——基本上因为非整数幂可能会由于精度损失而给出复数,即使它不应该这样,而且可能没有好的方法从中恢复。
对此,我相当满意,但我确实欢迎进一步的信息。
最佳答案
我假设是因为这些情况导致结果陷入复杂的境地,并且 ECMAScript 没有配备虚数。具体来说,您的示例应该产生接近 1 + 1.732i
的结果,以及其他结果。 (事实上 -2 也是一个可能的结果,这是无关紧要的 - 这是一个意外而不是一个规则。)
关于javascript - 具有负数和非整数幂的 Math.pow,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14575697/