为什么 Math.pow()(有时)不等于 JavaScript 中的 **?
Why is Math.pow() (sometimes) not equal to ** in JavaScript?
我刚刚发现 ECMAScript 7 特性 a**b
作为 Math.pow(a,b)
的替代品(MDN Reference) and came across a discussion in that post,它们显然表现不同。我已经在 Chrome 55 并且可以确认结果不同。
Math.pow(99,99)
returns 3.697296376497263e+197
而
99**99
returns 3.697296376497268e+197
因此记录差异 Math.pow(99,99) - 99**99
结果为 -5.311379928167671e+182
。
到目前为止,可以说这只是另一种实现,但将其包装在函数中的行为又有所不同:
function diff(x) {
return Math.pow(x,x) - x**x;
}
呼叫 diff(99)
returns 0
.
为什么会这样?
正如 xszaboj 所指出的,这可以缩小到这个问题:
var x = 99;
x**x - 99**99; // Returns -5.311379928167671e+182
99**99
是 evaluated at compile time ("constant folding"), and the compiler's pow
routine is different from the runtime one. When evaluating **
at run time, results are identical with Math.pow
— no wonder since **
is actually compiled 到 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
实际上
9999=369729637649726772657187905628805440595668764281741102430259972423552570455277523421410650010128232727940978889548326540119429996769494359451621570193644014418071060667659301384999779999159200499899
所以第一个结果是更好的近似值,但常量表达式和动态表达式之间不应出现这种差异。
这种行为看起来像是 V8 中的错误。它 has been reported 希望很快得到修复。
我刚刚发现 ECMAScript 7 特性 a**b
作为 Math.pow(a,b)
的替代品(MDN Reference) and came across a discussion in that post,它们显然表现不同。我已经在 Chrome 55 并且可以确认结果不同。
Math.pow(99,99)
returns 3.697296376497263e+197
而
99**99
returns 3.697296376497268e+197
因此记录差异 Math.pow(99,99) - 99**99
结果为 -5.311379928167671e+182
。
到目前为止,可以说这只是另一种实现,但将其包装在函数中的行为又有所不同:
function diff(x) {
return Math.pow(x,x) - x**x;
}
呼叫 diff(99)
returns 0
.
为什么会这样?
正如 xszaboj 所指出的,这可以缩小到这个问题:
var x = 99;
x**x - 99**99; // Returns -5.311379928167671e+182
99**99
是 evaluated at compile time ("constant folding"), and the compiler's pow
routine is different from the runtime one. When evaluating **
at run time, results are identical with Math.pow
— no wonder since **
is actually compiled 到 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
实际上
9999=369729637649726772657187905628805440595668764281741102430259972423552570455277523421410650010128232727940978889548326540119429996769494359451621570193644014418071060667659301384999779999159200499899
所以第一个结果是更好的近似值,但常量表达式和动态表达式之间不应出现这种差异。
这种行为看起来像是 V8 中的错误。它 has been reported 希望很快得到修复。