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




ecmascript-7