Почему математика.pow () (иногда) не равно * * в JavaScript?
я только что обнаружил функцию ECMAScript 7 a**b
в качестве альтернативы Math.pow(a,b)
(MDN Reference) и наткнулся на обсуждение в этот пост, в котором они, по-видимому, ведут себя по-разному. Я его проверял в 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
.
почему это происходит?
As xszaboj указал, Это можно сузить до этой проблемы:
var x = 99;
x**x - 99**99; // Returns -5.311379928167671e+182
1 ответов
99**99
is вычислено во время компиляции ("постоянное сворачивание"), а компилятор 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
на самом деле
9999=369729637649726772657187905628805440595668764281741102430259972423552570455277523421410650010128232727940978889548326540119429996769494359451621570193644014418071060667659301384999779999159200499899
таким образом, первый результат является лучшим приближением, но такое несоответствие между постоянными и динамическими выражениями не должно принимать место.
это поведение выглядит как ошибка в V8. Это сообщалось и надеюсь скоро исправлена.