Acabei de descobrir o recurso ECMAScript 7 a**b
como uma alternativa para Math.pow(a,b)
( Referência MDN ) e me deparei com uma discussão nesse post , na qual eles aparentemente se comportam de maneira diferente. Eu testei no Chrome 55 e posso confirmar que os resultados são diferentes.
Math.pow(99,99)
retorna 3.697296376497263e+197
enquanto que
99**99
retorna 3.697296376497268e+197
Portanto, registrar a diferença Math.pow(99,99) - 99**99
resulta em -5.311379928167671e+182
.
Até agora, pode-se dizer que é simplesmente outra implementação, mas envolvê-la em uma função se comporta de forma diferente novamente:
function diff(x) {
return Math.pow(x,x) - x**x;
}
diff(99)
retornos de chamada 0
.
Por que isso está acontecendo?
Como xszaboj apontou, isso pode ser reduzido a este problema:
var x = 99;
x**x - 99**99; // Returns -5.311379928167671e+182
javascript
google-chrome
v8
ecmascript-7
Thomas Altmann
fonte
fonte
`likethis`
para torná-lo legível e também evitar o problema de negrito / itálicoRespostas:
99**99
é avaliada em tempo de compilação ("dobramento constante"), e apow
rotina do compilador é diferente da de tempo de execução . Ao avaliar**
em tempo de execução, os resultados são idênticos aMath.pow
- não é de se admirar, já que**
na verdade é compilado para umaMath.pow
chamada:Na realidade
99 99 = 369729637649726772657187905628805440595668764281741102430259972423552570455277523421410650010128232727940978889548326540119429996769494359451621570193644014418071060667659301384999779999159200499899
então o primeiro resultado é uma aproximação melhor, ainda que tal discrepância entre expressões constantes e dinâmicas não deva ocorrer.
Este comportamento parece um bug no V8. Foi relatado e esperamos ser corrigido em breve.
fonte
99**99
antemão? Isso poderia ser considerado um bug, já queMath.pow
cria a mesma saída para números e variáveis e**
não?Math.row
é sempre tempo de execução, o dobramento const só pode ser feito para operadores. Sim, é definitivamente um bug.3.697296376497263e+197
,3.697296376497263e+197
e,3.697296376497263e+197
respectivamente. É definitivamente um bug do Chrome.