round redondear raiz quitar hacia ejemplos decimales cuadrada arriba javascript google-chrome v8 ecmascript-7

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.