116 votes

Pourquoi Math.pow() n'est (parfois) pas égal à ** en JavaScript ?

Je viens de découvrir la fonctionnalité d'ECMAScript 7 a**b comme alternative à Math.pow(a,b) ( Référence MDN ) et je suis tombé sur une discussion dans ce poste dans lequel ils se comportent apparemment différemment. Je l'ai testé dans Chrome 55 et je peux confirmer que les résultats sont différents.

Math.pow(99,99) renvoie à 3.697296376497263e+197

alors que

99**99 renvoie à 3.697296376497268e+197

Donc, l'enregistrement de la différence Math.pow(99,99) - 99**99 résulte en -5.311379928167671e+182 .

Jusqu'à présent, on pourrait dire qu'il s'agit simplement d'une autre implémentation, mais l'envelopper dans une fonction a un comportement différent :

function diff(x) {
  return Math.pow(x,x) - x**x;
}

en appelant diff(99) renvoie à 0 .

Pourquoi cela se produit-il ?

Comme xszaboj Comme nous l'avons souligné, le problème peut être réduit à ceci :

var x = 99;
x**x - 99**99; // Returns -5.311379928167671e+182

124voto

georg Points 52691

99**99 est évalué au moment de la compilation ("pliage constant"), et la méthode de compilation pow routine est différente de la runtime one . Lors de l'évaluation ** au moment de l'exécution, les résultats sont identiques avec Math.pow - pas étonnant puisque ** est en fait compilé à un Math.pow appeler :

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

En fait,

99 99 \=369729637649726772657187905628805440595668764281741102430259972423552570455277523421410650010128232727940978889548326540119429996769494359451621570193644014418071060667659301384999779999159200499899

Le premier résultat est donc une meilleure approximation, mais une telle divergence entre les expressions constantes et dynamiques ne devrait pas exister.

Ce comportement ressemble à un bogue dans V8. Il s'agit de a été signalé et sera, espérons-le, bientôt réparé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X