为什么在JavaScript中,Math.pow(1, NaN)等于NaN?

5
IEEE 754-2008"9.2.1特殊值"一节中提到:

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

为了不阅读整个文件,维基百科给出了快捷方式

IEEE 754标准的2008年版本指出,pow(1, qNaN)pow(qNaN, 0)应该都返回1,因为它们无论使用什么其他值代替安静的NaN都会返回1

那么为什么JavaScript中Math.pow(1, NaN)NaN?它不遵循标准吗?

可能应该是“对于任何数字y,pow(+1,y)等于1”,但NaN不是一个数字。 - Shadow The Spring Wizard
@Quentin - NaN是一个数字,但仍然不是数字。 :) - Achrome
或者你可以确保在将参数传递给 pow 之前,它们是数字,这样就不会有任何问题了。 - jbabey
我注意到了,删除了我的评论。我认为你甚至错过了有趣的部分,因为整行实际上是:“对于任何y(甚至是安静的NaN),pow(+1,y)都是1”。 - Felix Kling
@FelixKling 是的,我因为某些原因跳过了它。同时在问题中添加了维基澄清。 - VisioN
显示剩余2条评论
3个回答

5

这是因为 ECMAscript规范 是这样说的。

pow (x, y)

返回将 x 的值提高到 y 次幂的实现依赖逼近值。

  • 如果 yNaN,则结果为 NaN
  • ... 其他限制条件...

当然,这就是原因。所以看起来JavaScript不遵循标准? - VisioN
1
不,JavaScript 遵循标准。事实上,即使 NaN 保存了一个数值,它也不能作为数字进行计算。因此,当计算 Math.pow(1, NaN) 时,并不是将 NaN 视为数字进行计算。 - Achrome
2
@AshwinMukhija 我没听懂你的意思。IEEE 754明确规定 pow(1, NaN) 总是等于 1,而ECMAscript规范则相反。 - VisioN
2
好吧,我并不特别希望2009年的ECMAScript规范考虑到2008年IEEE-754规范的变化。但它确实考虑到了。从参考文献中可以看出,它明确引用了IEEE Std 754-2008。所以这似乎是一个规范错误。 - Scott Sauyet

2
根据维基百科文章pow的定义是在2008年被添加到IEEE 754中的。它也是可选的。
另一方面,ECMAScript的pow自至少1997年起就被定义为如果第二个参数是NaN则返回NaN,在当年的标准的第15.8.2.13节中。
看起来ECMA委员会选择保持与JavaScript超过十年的兼容性,而不是遵守IEEE的奇特新建议。

1
这是因为NaN表示“不是一个数字”,是一种数学上的未定义。在数学中,1的undefined次方也是未定义的。

它不是某种未定义的东西。NaN == undefined 的结果为假。 :) - Rob Hruska
你是对的,我指的是数学术语“未定义”,而不是JS中的undefined。我已经更正了答案。 - qballer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接