Właśnie odkryłem funkcję ECMAScript 7 a**b
jako alternatywę dla Math.pow(a,b)
( Dokumentacja MDN ) i natknąłem się na dyskusję w tym poście , w której najwyraźniej zachowują się inaczej. Przetestowałem to w Chrome 55 i mogę potwierdzić, że wyniki się różnią.
Math.pow(99,99)
zwroty 3.697296376497263e+197
natomiast
99**99
zwroty 3.697296376497268e+197
Tak więc rejestrowanie różnicy Math.pow(99,99) - 99**99
skutkuje -5.311379928167671e+182
.
Do tej pory można by powiedzieć, że to po prostu kolejna implementacja, ale opakowanie jej w funkcję zachowuje się znowu inaczej:
function diff(x) {
return Math.pow(x,x) - x**x;
}
wywołanie diff(99)
zwrotów 0
.
Dlaczego tak się dzieje?
Jak zauważył xszaboj , można to zawęzić do tego problemu:
var x = 99;
x**x - 99**99; // Returns -5.311379928167671e+182
javascript
google-chrome
v8
ecmascript-7
Thomas Altmann
źródło
źródło
`likethis`
aby czytelny, a także uniknąć pogrubienie / kursywa problemuOdpowiedzi:
99**99
jest oceniana w czasie kompilacji ( „ciągłego zwijania”) oraz kompilatorpow
rutyna jest różna od jednego wykonawczego . Podczas obliczania**
w czasie wykonywania wyniki są identyczne zMath.pow
- nic dziwnego, ponieważ**
jest faktycznie kompilowany doMath.pow
wywołania:Tak właściwie
99 99 = 369729637649726772657187905628805440595668764281741102430259972423552570455277523421410650010128232727940978889548326540119429996769494359451621570193644014418079915603086599847998499996693099849984999966930998499849999667999966930998499849999667999966930998499849999667999966799849984999966799667998499996679984999966799849999667999966799849999667996679984998499996679966799849999667998499996679999666
więc pierwszy wynik jest lepszym przybliżeniem, nadal taka rozbieżność między wyrażeniami stałymi i dynamicznymi nie powinna mieć miejsca.
To zachowanie wygląda jak błąd w wersji 8. Zostało to zgłoszone i miejmy nadzieję, że wkrótce zostanie naprawione.
źródło
99**99
? Czy można to uznać za błąd, ponieważMath.pow
tworzy takie same dane wyjściowe dla liczb i zmiennych, a**
nie?Math.row
jest zawsze uruchomiona , składanie const można wykonać tylko dla operatorów. Tak, to zdecydowanie błąd.3.697296376497263e+197
,3.697296376497263e+197
, i3.697296376497263e+197
odpowiednio. To zdecydowanie błąd Chrome.