Почему математика.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. Это сообщалось и надеюсь скоро исправлена.