Visualizer Float IEEE-754
Lihat dengan tepat bagaimana nombor perpuluhan disimpan sebagai float IEEE-754 — bit tanda, bit eksponen dan bit mantisa — dan kenapa nombor seperti 0.1 tidak disimpan dengan tepat.
🔒 Diproses sepenuhnya dalam penyemak imbas anda — tiada apa yang anda masukkan di sini pernah dimuat naik.
Keputusan
Setiap nombor titik apung yang disimpan oleh komputer — nombor JavaScript, float C, float Python — dikodkan dengan cara yang sama di bawah IEEE 754: satu bit tanda, satu blok bit eksponen, dan satu blok bit mantisa (pecahan). Ketepatan tunggal (32-bit) menggunakan 1 bit tanda, 8 bit eksponen dan 23 bit mantisa; ketepatan ganda dua (64-bit), format di sebalik jenis nombor lalai hampir setiap bahasa, menggunakan 1 bit tanda, 11 bit eksponen dan 52 bit mantisa. Alat ini mengambil sebarang nombor perpuluhan yang anda taip, mengodkannya dalam mana-mana lebar menggunakan pengekod float DataView/ArrayBuffer terbina dalam pelayar — mesin yang sama yang kod anda sebenarnya jalankan — dan mewarnakan setiap bit mengikut kawasan mana ia tergolong.
Pengekodan itu sendiri mengikut tiga langkah, dan alat ini melalui kesemuanya dan bukannya hanya menunjukkan bit akhir. Pertama, penormalan: nombor itu ditulis semula sebagai 1.mantisa × 2^eksponen, dengan betul-betul satu digit bukan sifar sebelum titik perduaan (nombor yang terlalu kecil untuk itu mendapat layanan subnormal sebaliknya, tanpa 1 pendahulu tersirat). Kedua, pincang eksponen: memandangkan medan eksponen mesti menyimpan kedua-dua eksponen positif dan negatif sebagai nombor tidak bertanda, satu pincang tetap (127 untuk ketepatan tunggal, 1023 untuk ganda dua) ditambah sebelum medan itu ditulis dalam perduaan. Ketiga, mantisa pecahan dikembangkan bit demi bit dengan kaedah klasik "darab dua, ambil bahagian integer sebagai bit seterusnya, simpan bakinya" — diulang sehingga medan mantisa penuh, di mana bit lebihan menentukan sama ada hasilnya dibundarkan naik atau turun (bundar-separuh-ke-genap, lalai IEEE-754).
Inilah sebabnya kenapa nombor biasa seperti 0.1 tidak disimpan dengan tepat. Dalam perduaan, 0.1 ialah pecahan berulang (0.0001100110011…, selama-lamanya), jadi tiada mantisa terhingga yang boleh memegangnya dengan jitu — ia mesti dibundarkan di suatu tempat. Kodkan 0.1 sebagai float 32-bit dan baca semula bit itu, dan anda tidak mendapat 0.1 kembali: anda mendapat tepat 0.100000001490116119384765625. Ketepatan ganda dua mempunyai 29 bit mantisa lebih untuk digunakan, jadi ralat pembundarannya jauh lebih kecil, tetapi ia juga bukan sifar — 0.1 sebagai ganda dua 64-bit adalah tepat 0.1000000000000000055511151231257827021181583404541015625. Alat ini mengira nilai tersimpan yang tepat itu dengan aritmetik integer besar (tiada jalan pintas titik apung) supaya jurang antara apa yang anda taip dan apa yang perkakasan sebenarnya simpan tidak pernah disembunyikan atau dianggarkan.
Nilai khas mendapat corak bit yang tepat dan terpelihara dan bukannya pengekodan biasa: sifar dan sifar negatif mempunyai semua bit eksponen dan mantisa sifar (hanya bit tanda yang berbeza), ±Infiniti mempunyai semua bit eksponen satu dengan mantisa semua sifar, dan NaN mempunyai semua bit eksponen satu dengan sekurang-kurangnya satu bit mantisa ditetapkan. Semuanya di sini berjalan secara setempat dalam pelayar anda — tiada apa yang anda taip dimuat naik ke mana-mana — yang menjadikan ini tempat yang selamat untuk membina gerak hati sebenar tentang pepijat titik apung: kenapa `0.1 + 0.2 !== 0.3` dalam hampir setiap bahasa pengaturcaraan, kenapa tekstur float32 dalam kod grafik kehilangan ketepatan yang float64 tidak akan, dan kenapa kod kewangan secara amnya harus mengelakkan titik apung perduaan sama sekali.