javascript - 具有负数和非整数幂的 Math.pow

标签 javascript floating-point ieee-754 ecmascript-5 ecma262

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/

相关文章:

javascript - 里程表速度计jquery插件

JavaScript 对象规则

c - 使用 lex 检测 float

c - IEEE 浮点表示

c - 为什么 10/3 在 C 中是准确的?

php - 如何在 php 中处理耗时的任务?

Python 浮点比

linux - Linux内核中浮点的使用

c - 我*不*想要函数 exp 的正确舍入

javascript - ng-init 通过新 obj 传递值