Sebagai contoh, pada mulanya saya mempunyai kod ini:
function(x,y){ let z=x+y; . . . }
Kemudian saya dapati bahawa y mestilah sama dengan x Saya ingin membina semula x+y menjadi x * 2, tetapi saya perlu memastikan bahawa keseluruhan program berkelakuan sama sebelum dan selepas pembinaan semula. Adakah x+x sama dengan x*2? Saya tertanya-tanya jika + dan * menggunakan mekanisme pengiraan yang berbeza, yang membawa kepada pembundaran kepada hasil yang berbeza.
Saya menguji:
for(let i=0.01;i<100;i++){ if(i+i!=i*2){ console.log(i); break; } }
Nampaknya betul untuk julat tertentu i , tetapi tidak pasti sama ada ia betul untuk semua nombor titik terapung.
JavaScript ialah pelaksanaan ECMAScript, dan spesifikasi ECMAScript bermaksud menggunakan algoritma IEEE 754, format IEEE-754 "double precision" (binary64) Fasal 5.2.5 menyatakan "... apabila digunakan pada nombor, operator Merujuk kepada operasi yang berkaitan dalam IEEE 754-2019..."
Dalam IEEE 754 dan mana-mana sistem titik terapung yang munasabah, hasil operasi ialah keputusan matematik tepat yang dibundarkan mengikut peraturan pembundaran yang dipilih (cth., bulat ke terdekat, bulat ke genap, bulat ke genap), bulat ke sifar, bulat ke atas dibulatkan ke atas atau ke bawah). IEEE 754-2019 4.3 berkata:
Memandangkan
x
+x
和 2•x
具有相同的数学结果,因此浮点运算x+x
code> 和2*x
mesti menghasilkan hasil pengiraan yang sama. Jika peraturan pembundaran yang sama digunakan, kedua-duanya akan memberikan hasil matematik yang sama, jadi pengiraan mestilah sama.Yang dibincangkan di atas
x
是数字的情况,包括+∞和-∞。如果x
是NaN
,则x+x
和2*x
也会产生NaN
code>,所以结果又是一样的。 (请注意,在这种情况下,x+x == 2*x
将计算为 false,因为 NaN 不等于任何内容,甚至不等于其本身。尽管如此,这两个运算会产生相同的结果;如果使用2*x
代替x+x
, tingkah laku program akan sama dan begitu juga sebaliknya. )