当前位置:  开发笔记 > 编程语言 > 正文

为什么Math.pow()(有时)在JavaScript中不等于**?

如何解决《为什么Math.pow()(有时)在JavaScript中不等于**?》经验,为你挑选了1个好方法。

我刚刚发现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中的错误.据报道,很快就会得到解决.



1> georg..:

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
推荐阅读
oDavid_仔o_880
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有