redondear - ¿Por qué Math.pow()(a veces) no es igual a** en JavaScript?
raiz cuadrada javascript (1)
Acabo de descubrir la función ECMAScript 7
a**b
como alternativa para
Math.pow(a,b)
(
Referencia MDN
) y encontré una discusión en
esa publicación
, en la que aparentemente se comportan de manera diferente.
Lo probé en Chrome 55 y puedo confirmar que los resultados difieren.
Math.pow(99,99)
devuelve
3.697296376497263e+197
mientras
99**99
devuelve
3.697296376497268e+197
Entonces, registrar la diferencia
Math.pow(99,99) - 99**99
resulta en
-5.311379928167671e+182
.
Hasta ahora se podría decir que es simplemente otra implementación, pero envolverlo en una función se comporta de nuevo de manera diferente:
function diff(x) {
return Math.pow(x,x) - x**x;
}
llamar a
diff(99)
devuelve
0
.
¿Por qué está pasando eso?
Como señaló xszaboj , esto se puede reducir a este problema:
var x = 99;
x**x - 99**99; // Returns -5.311379928167671e+182
99**99
se
evalúa en el momento de la compilación
("plegado constante"), y la
rutina
pow
del compilador es diferente de la del
tiempo de ejecución
.
Al evaluar
**
en tiempo de ejecución, los resultados son idénticos a
Math.pow
, no es de extrañar ya que
**
se
compiled
realmente en una llamada
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
Realmente
36.
así que el primer resultado es una mejor aproximación, aún así no debería producirse una discrepancia entre las expresiones constantes y dinámicas.
Este comportamiento parece un error en V8. Se ha informado y, con suerte, se solucionará pronto.