nodejs - mathpow javascript
Por que Math.pow()(às vezes) não é igual a** no JavaScript? (1)
99**99
é
avaliado em tempo de compilação
("dobragem constante"), e a
rotina de
pow
do compilador é diferente da
rotina
de
execução
.
Ao avaliar
**
em tempo de execução, os resultados são idênticos ao
Math.pow
- não é de admirar, pois
**
é realmente
compiled
em uma chamada
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
Na realidade
99 = 36972963764972677265718790562880544059566876428174110243025997242355257045527752342141065001012823272794097888954832654011942999676949435
portanto, o primeiro resultado é uma melhor aproximação, ainda que essa discrepância entre expressões constantes e dinâmicas não deva ocorrer.
Esse comportamento parece um bug na V8. Foi relatado e, com sorte, será corrigido em breve.
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 diferem.
Math.pow(99,99)
retorna
3.697296376497263e+197
enquanto que
99**99
retorna
3.697296376497268e+197
Portanto, registrando 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 novo:
function diff(x) {
return Math.pow(x,x) - x**x;
}
chamar
diff(99)
retorna
0
.
Por que isso está acontecendo?
Como o xszaboj apontou, isso pode ser xszaboj a este problema:
var x = 99;
x**x - 99**99; // Returns -5.311379928167671e+182