Je viens de découvrir la fonctionnalité ECMAScript 7 a**b
comme alternative à Math.pow(a,b)
( MDN Reference ) et suis tombé sur une discussion dans ce post , dans laquelle ils se comportent apparemment différemment. Je l'ai testé dans Chrome 55 et je peux confirmer que les résultats diffèrent.
Math.pow(99,99)
Retour 3.697296376497263e+197
tandis que
99**99
Retour 3.697296376497268e+197
Donc, consigner la différence se Math.pow(99,99) - 99**99
traduit par -5.311379928167671e+182
.
Jusqu'à présent, on pourrait dire que c'est simplement une autre implémentation, mais l'envelopper dans une fonction se comporte à nouveau différemment:
function diff(x) {
return Math.pow(x,x) - x**x;
}
l'appel diff(99)
revient 0
.
Pourquoi cela se produit-il?
Comme l'a souligné xszaboj , cela peut être réduit à ce problème:
var x = 99;
x**x - 99**99; // Returns -5.311379928167671e+182
javascript
google-chrome
v8
ecmascript-7
Thomas Altmann
la source
la source
`likethis`
pour le rendre lisible et éviter le problème gras / italiqueRéponses:
99**99
est évalué au moment de la compilation ("repli constant"), et lapow
routine du compilateur est différente de celle du runtime . Lors de l'évaluation**
au moment de l'exécution, les résultats sont identiques àMath.pow
- pas étonnant car il**
est en fait compilé en unMath.pow
appel:Réellement
99 99 = 369729637649726772657187905628805440595668764281741102430259972423552570455277523421410650010128232727940978889548326540119429996769494359451621570193644014419989982007106061570193644014419989989989969971060
le premier résultat est donc une meilleure approximation, mais un tel écart entre les expressions constantes et dynamiques ne devrait pas avoir lieu.
Ce comportement ressemble à un bogue dans la V8. Il a été signalé et devrait être corrigé bientôt.
la source
99**99
au préalable? Cela pourrait-il être considéré comme un bogue, carMath.pow
crée la même sortie pour les nombres et les variables et**
ne le fait pas?Math.row
est toujours à l'exécution, le pliage const ne peut être effectué que pour les opérateurs. Oui, c'est définitivement un bug.3.697296376497263e+197
,3.697296376497263e+197
et3.697296376497263e+197
respectivement. C'est très certainement un bogue de Chrome.