Acabo de descubrir la función ECMAScript 7 a**b
como 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**99
da 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**99
se evalúa en tiempo de compilación ("plegado constante"), y lapow
rutina 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.pow
llamada: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**99
antemano? ¿Podría esto considerarse un error, ya queMath.pow
crea la misma salida para números y variables y**
no?Math.row
siempre 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+197
respectivamente. Definitivamente es un error de Chrome.