我刚刚发现ECMAScript 7功能可以a**b
作为Math.pow(a,b)
(MDN参考)的替代产品,并且在该帖子中遇到了一个讨论,在这些讨论中它们的行为显然有所不同。我已经在Chrome 55中对其进行了测试,可以确认结果是否有所不同。
Math.pow(99,99)
退货 3.697296376497263e+197
而
99**99
退货 3.697296376497268e+197
因此记录差异会Math.pow(99,99) - 99**99
导致-5.311379928167671e+182
。
到目前为止,可以说这只是另一个实现,但是将其包装在函数中的行为又有所不同:
function diff(x) {
return Math.pow(x,x) - x**x;
}
打电话diff(99)
的回报0
。
为什么会这样呢?
正如xszaboj所指出的,可以缩小到这个问题:
var x = 99;
x**x - 99**99; // Returns -5.311379928167671e+182
99**99
是在编译时评价(“常量折叠”),以及编译器的pow
程序是从不同的运行时一个。**
在运行时进行评估时,结果与Math.pow
— 相同,也就不足为奇了,因为**
实际上是编译为Math.pow
调用的:
console.log(99**99); // 3.697296376497268e+197
a = 99, b = 99;
console.log(a**b); // 3.697296376497263e+197
console.log(Math.pow(99, 99)); // 3.697296376497263e+197
其实
99 99 = 369729637649726772657187905628805440595668764281741102430259972423552570455277523421410650010128232727940978889548326540119429996769494359451621570193644014418071060667659301384999779999159200499899
因此第一个结果是更好的近似,但常量和动态表达式之间的这种差异仍然不应该发生。
此行为看起来像是V8中的错误。据报道,有望尽快修复。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句