Saya baru saja menemukan fitur ECMAScript 7 a**b
sebagai alternatif untuk Math.pow(a,b)
( Referensi MDN ) dan menemukan diskusi di posting itu , di mana mereka tampaknya berperilaku berbeda. Saya telah mengujinya di Chrome 55 dan dapat mengonfirmasi bahwa hasilnya berbeda.
Math.pow(99,99)
kembali 3.697296376497263e+197
sedangkan
99**99
kembali 3.697296376497268e+197
Jadi mencatat Math.pow(99,99) - 99**99
hasil perbedaan -5.311379928167671e+182
.
Sejauh ini dapat dikatakan, bahwa ini hanyalah implementasi lain, tetapi membungkusnya dalam sebuah fungsi berperilaku berbeda lagi:
function diff(x) {
return Math.pow(x,x) - x**x;
}
menelepon diff(99)
kembali 0
.
Mengapa itu terjadi?
Seperti yang ditunjukkan xszaboj , ini dapat dipersempit menjadi masalah ini:
var x = 99;
x**x - 99**99; // Returns -5.311379928167671e+182
javascript
google-chrome
v8
ecmascript-7
Thomas Altmann
sumber
sumber
`likethis`
agar dapat dibaca dan juga menghindari masalah huruf tebal / miringJawaban:
99**99
adalah dievaluasi pada waktu kompilasi ( "konstan lipat"), dan compilerpow
rutin berbeda dari satu runtime . Saat mengevaluasi**
pada waktu proses, hasilnya identik denganMath.pow
- tidak heran karena**
sebenarnya dikompilasi keMath.pow
panggilan:Sebenarnya
99 99 Data
jadi hasil pertama adalah perkiraan yang lebih baik, tetap saja perbedaan antara ekspresi konstan dan dinamis tidak boleh terjadi.
Perilaku ini terlihat seperti bug di V8. Ini telah dilaporkan dan mudah-mudahan akan segera diperbaiki.
sumber
99**99
sebelumnya? Mungkinkah ini dianggap bug, karenaMath.pow
membuat keluaran yang sama untuk angka dan variabel dan**
tidak?Math.row
selalu runtime, pelipatan const hanya dapat dilakukan untuk operator. Ya, itu pasti bug.3.697296376497263e+197
,3.697296376497263e+197
, dan3.697296376497263e+197
masing-masing. Ini pasti bug Chrome.