Acabo de descubrir la función ECMAScript 7 a**bcomo una alternativa para Math.pow(a,b)( Referencia de 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 son diferentes.
Math.pow(99,99) devoluciones 3.697296376497263e+197
mientras
99**99 devoluciones 3.697296376497268e+197
Entonces, registrar la diferencia Math.pow(99,99) - 99**99da como resultado -5.311379928167671e+182.
Hasta ahora se podría decir que es simplemente otra implementación, pero envolverla en una función se comporta diferente nuevamente:
function diff(x) {
return Math.pow(x,x) - x**x;
}
diff(99)devoluciones de llamada 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
javascript
google-chrome
v8
ecmascript-7
Thomas Altmann
fuente
fuente

`likethis`para que sea legible y también evitar el problema de negrita / cursivaRespuestas:
99**99se evalúa en tiempo de compilación ("plegado constante"), y lapowrutina del compilador es diferente de la del tiempo de ejecución . Al evaluar**en tiempo de ejecución, los resultados son idénticos aMath.pow, no es de extrañar ya**que en realidad se compila en unaMath.powllamada:Realmente
99 99 = 36972963764972677265718790562880544059566876428174110243025997242355257045527752342141065001012823272794097888954832654011942999676949435945162157019364401467980730998
por lo que el primer resultado es una mejor aproximación, aún así tal discrepancia entre expresiones constantes y dinámicas no debería ocurrir.
Este comportamiento parece un error en V8. Se ha informado y se espera que se solucione pronto.
fuente
99**99antemano? ¿Podría esto considerarse un error, ya queMath.powcrea la misma salida para números y variables y**no?Math.rowsiempre es tiempo de ejecución, el plegado constante solo se puede realizar para operadores. Sí, definitivamente es un error.3.697296376497263e+197,3.697296376497263e+197, y3.697296376497263e+197respectivamente. Definitivamente es un error de Chrome.