我刚刚发现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
georg.. 122
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 = 369729637649726772657187905628805440595668764281741102430259972423552570455277522521410650010128232727940978889548326540119429996769494359451621570193644014418071060667659301384999779999159200499899
所以第一个结果是更好的近似,仍然不应该发生恒定和动态表达之间的这种差异.
此行为看起来像V8中的错误.据报道,很快就会得到解决.
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