IEEE-754 Float Visualizer
Lihat dengan tepat cara nombor perpuluhan disimpan sebagai apungan IEEE-754 — bit tanda, bit eksponen dan bit mantissa — dan sebab nombor seperti 0.1 tidak disimpan dengan tepat.
Hasilnya
Setiap nombor titik terapung yang disimpan oleh komputer — nombor JavaScript, terapung C, terapung Python — dikodkan dengan cara yang sama di bawah IEEE 754: satu bit tanda, satu blok bit eksponen dan satu blok bit mantissa (pecahan). Ketepatan tunggal (32-bit) menggunakan 1 bit tanda, 8 bit eksponen dan 23 bit mantissa; ketepatan berganda (64-bit), format di sebalik hampir setiap jenis nombor lalai bahasa, menggunakan 1 bit tanda, 11 bit eksponen dan 52 bit mantissa. Alat ini mengambil sebarang nombor perpuluhan yang anda taip, mengekodnya dalam sama ada lebar menggunakan pengekod apungan DataView/ArrayBuffer penyemak imbas sendiri — jentera yang sama yang digunakan oleh kod anda — dan warnakan setiap bit mengikut wilayah mana ia berada.
Pengekodan itu sendiri mengikut tiga langkah, dan alat ini berjalan melalui kesemuanya dan bukannya hanya menunjukkan bit terakhir. Pertama, penormalan: nombor itu ditulis semula sebagai 1.mantissa × 2^eksponen, dengan tepat satu digit bukan sifar sebelum titik perduaan (nombor terlalu kecil untuk itu mendapat rawatan subnormal sebaliknya, tanpa pendahuluan 1 tersirat). Kedua, pincang eksponen: memandangkan medan eksponen mesti menyimpan kedua-dua eksponen positif dan negatif sebagai nombor tidak bertanda, pincang tetap (127 untuk ketepatan tunggal, 1023 untuk dua kali ganda) ditambah sebelum medan ditulis dalam binari. Ketiga, mantissa pecahan dikembangkan sedikit demi sedikit dengan kaedah klasik "darab dengan dua, ambil bahagian integer sebagai bit seterusnya, kekalkan baki" - diulang sehingga medan mantissa penuh, pada ketika itu bit sisa memutuskan sama ada keputusan itu dibundarkan ke atas atau ke bawah (pusingan separuh kepada genap, lalai IEEE-754).
Inilah sebabnya mengapa nombor biasa seperti 0.1 tidak disimpan dengan tepat. Dalam perduaan, 0.1 ialah pecahan berulang (0.0001100110011…, selama-lamanya), jadi tiada mantissa terhingga boleh menahannya dengan tepat — ia perlu dibundarkan di suatu tempat. Kodkan 0.1 sebagai apungan 32-bit dan baca kembali bit, dan anda tidak mendapat 0.1 kembali: anda mendapat tepat 0.100000001490116119384765625. Ketepatan berganda mempunyai 29 lagi bit mantissa untuk digunakan, jadi ralat pembundarannya jauh lebih kecil, tetapi ia juga bukan sifar — 0.1 kerana gandaan 64-bit adalah tepat 0.100000000000000000555111512312578270211815834045 Alat ini mengira nilai tersimpan tepat itu dengan aritmetik integer besar (tiada pintasan titik terapung) supaya jurang antara perkara yang anda taip dan apa yang disimpan oleh perkakasan tidak pernah disembunyikan atau dianggarkan.
Nilai khas mendapat corak bit yang tepat dan terpelihara dan bukannya pengekodan biasa: sifar dan sifar negatif mempunyai eksponen semua sifar dan bit mantissa (hanya bit tanda berbeza), ±Infinity mempunyai bit eksponen semua-satu dengan mantissa semua-sifar, dan NaN mempunyai bit eksponen semua-satu dengan sekurang-kurangnya satu set bit mantissa. Segala-galanya di sini berjalan secara setempat dalam penyemak imbas anda — tiada apa yang anda taip dimuat naik di mana-mana — yang menjadikan ini tempat yang selamat untuk membina intuisi sebenar bagi pepijat titik terapung: mengapa `0.1 + 0.2 !== 0.3` dalam hampir setiap bahasa pengaturcaraan, mengapa tekstur float32 dalam kod grafik kehilangan ketepatan yang float64 tidak akan berlaku, dan mengapa kod kewangan secara amnya harus mengelakkan terapung binari.