Ich habe gerade die ECMAScript 7-Funktion a**b
als Alternative für Math.pow(a,b)
( MDN-Referenz ) entdeckt und bin in diesem Beitrag auf eine Diskussion gestoßen , in der sie sich anscheinend anders verhalten. Ich habe es in Chrome 55 getestet und kann bestätigen, dass die Ergebnisse unterschiedlich sind.
Math.pow(99,99)
kehrt zurück 3.697296376497263e+197
wohingegen
99**99
kehrt zurück 3.697296376497268e+197
Protokollieren Sie also den Unterschied Math.pow(99,99) - 99**99
führt also zu -5.311379928167671e+182
.
Bisher könnte man sagen, dass es einfach eine andere Implementierung ist, aber das Einschließen in eine Funktion verhält sich wieder anders:
function diff(x) {
return Math.pow(x,x) - x**x;
}
Berufung diff(99)
zurückkehrt 0
.
Warum passiert das?
Wie xszaboj betonte, kann dies auf dieses Problem eingegrenzt werden:
var x = 99;
x**x - 99**99; // Returns -5.311379928167671e+182
quelle
`likethis`
, um es lesbar zu machen und auch das Fett / Kursiv-Problem zu vermeidenAntworten:
99**99
wird zur Kompilierungszeit ausgewertet ("konstantes Falten"), und diepow
Routine des Compilers unterscheidet sich von der Routine zur Laufzeit . Bei der Auswertung**
zur Laufzeit sind die Ergebnisse identisch mitMath.pow
- kein Wunder, da**
tatsächlich zu einem Aufruf kompiliert wirdMath.pow
:Tatsächlich
99 99 = 36972963764972677265718790562880544059566876428174110243025997242355257045527752342141065001012823272794097888954832654011942999676949435945162157019364401441999999
Das erste Ergebnis ist also eine bessere Annäherung, dennoch sollte eine solche Diskrepanz zwischen konstanten und dynamischen Ausdrücken nicht auftreten.
Dieses Verhalten sieht aus wie ein Fehler in V8. Es wurde berichtet und wird hoffentlich bald behoben.
quelle
99**99
Voraus zu verbessern ? Könnte dies als Fehler angesehen werden, daMath.pow
für Zahlen und Variablen dieselbe Ausgabe erstellt wird und**
dies nicht der Fall ist?Math.row
ist immer Laufzeit, const Folding kann nur für Operatoren durchgeführt werden. Ja, es ist definitiv ein Fehler.3.697296376497263e+197
,3.697296376497263e+197
, und3.697296376497263e+197
jeweils. Es ist definitiv ein Chrome-Fehler.