Я только что обнаружил функцию 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
javascript
google-chrome
v8
ecmascript-7
Томас Альтманн
источник
источник
`likethis`
чтобы сделать его читабельным, а также избежать проблем с жирным / курсивомОтветы:
99**99
будет оценено во время компиляции ( «постоянного складывание»), а также компиляторpow
подпрограмма отличается от выполнения одного . При оценке**
во время выполнения результаты идентичныMath.pow
- неудивительно, поскольку**
фактически компилируется дляMath.pow
вызова:Фактически
99 99 = 369729637649726772657187905628805440595668764281741102430259972423552570455277523421410650010128232727940978889548326540119429996769494359451621570193644014418093079984
поэтому первый результат - лучшее приближение, тем не менее, такого несоответствия между постоянными и динамическими выражениями не должно быть.
Такое поведение похоже на ошибку в V8. Об этом было сообщено, и мы надеемся, что скоро все исправят.
источник
99**99
заранее повысить производительность вычислений ? Можно ли считать это ошибкой, посколькуMath.pow
создает одинаковые выходные данные для чисел и переменных, а**
не?Math.row
всегда выполняется, сворачивание констант может выполняться только для операторов. Да, это определенно ошибка.3.697296376497263e+197
,3.697296376497263e+197
, и3.697296376497263e+197
соответственно. Это определенно ошибка Chrome.