0

Visualisator Float IEEE-754

Lihat persis bagaimana angka desimal disimpan sebagai float IEEE-754 — bit tanda, bit eksponen, dan bit mantissa — dan mengapa angka seperti 0.1 tidak disimpan secara persis.

🔒 Diproses sepenuhnya di browser Anda — apa pun yang Anda masukkan di sini tidak akan pernah diunggah.

Memproses... 0%
Menormalisasi
Menghitung bias eksponen
Mengekspansi bit mantissa
Selesai

Hasil

Setiap angka floating-point yang disimpan komputer — angka JavaScript, float C, float Python — di-encode dengan cara yang sama di bawah IEEE 754: satu bit tanda, satu blok bit eksponen, dan satu blok bit mantissa (pecahan). Presisi tunggal (32-bit) menggunakan 1 bit tanda, 8 bit eksponen, dan 23 bit mantissa; presisi ganda (64-bit), format di balik tipe angka bawaan hampir semua bahasa, menggunakan 1 bit tanda, 11 bit eksponen, dan 52 bit mantissa. Alat ini mengambil angka desimal apa pun yang Anda ketik, meng-encode-nya dalam lebar mana pun menggunakan encoder float DataView/ArrayBuffer bawaan browser — mesin yang sama tempat kode Anda benar-benar berjalan — dan mewarnai setiap bit berdasarkan area mana bit tersebut berada.

Encoding itu sendiri mengikuti tiga langkah, dan alat ini menjalani semuanya alih-alih hanya menampilkan bit akhir. Pertama, normalisasi: angka ditulis ulang sebagai 1.mantissa × 2^eksponen, dengan tepat satu digit bukan nol sebelum titik biner (angka yang terlalu kecil untuk itu mendapat perlakuan subnormal, tanpa awalan 1 implisit). Kedua, bias eksponen: karena medan eksponen harus menyimpan eksponen positif dan negatif sebagai angka tak bertanda, bias tetap (127 untuk presisi tunggal, 1023 untuk ganda) ditambahkan sebelum medan ditulis dalam biner. Ketiga, mantissa pecahan diekspansi bit demi bit dengan metode klasik “kalikan dua, ambil bagian bilangan bulat sebagai bit berikutnya, simpan sisanya” — diulangi sampai medan mantissa penuh, di mana bit yang tersisa menentukan apakah hasilnya dibulatkan ke atas atau ke bawah (round-half-to-even, bawaan IEEE-754).

Inilah tepatnya mengapa angka biasa seperti 0.1 tidak disimpan secara persis. Dalam biner, 0.1 adalah pecahan berulang (0.0001100110011…, selamanya), jadi tidak ada mantissa terbatas yang dapat menampungnya secara presisi — ia harus dibulatkan di suatu titik. Encode 0.1 sebagai float 32-bit dan baca kembali bit-nya, dan Anda tidak mendapatkan kembali 0.1: Anda mendapatkan persis 0.100000001490116119384765625. Presisi ganda memiliki 29 bit mantissa lebih banyak untuk digunakan, jadi galat pembulatannya jauh lebih kecil, tetapi itu juga bukan nol — 0.1 sebagai double 64-bit adalah persis 0.1000000000000000055511151231257827021181583404541015625. Alat ini menghitung nilai tersimpan yang persis itu dengan aritmetika big-integer (tanpa jalan pintas floating-point) sehingga celah antara apa yang Anda ketik dan apa yang sebenarnya disimpan perangkat keras tidak pernah disembunyikan atau didekati.

Nilai khusus mendapat pola bit yang persis dan dicadangkan alih-alih encoding normal: nol dan nol negatif memiliki bit eksponen dan mantissa yang semuanya nol (hanya bit tanda yang berbeda), ±Infinity memiliki bit eksponen yang semuanya satu dengan mantissa semuanya nol, dan NaN memiliki bit eksponen semuanya satu dengan setidaknya satu bit mantissa terset. Semuanya di sini berjalan secara lokal di browser Anda — apa pun yang Anda ketik tidak diunggah ke mana pun — yang menjadikan ini tempat yang aman untuk membangun intuisi nyata tentang bug floating-point: mengapa `0.1 + 0.2 !== 0.3` di hampir semua bahasa pemrograman, mengapa tekstur float32 dalam kode grafis kehilangan presisi yang tidak akan terjadi pada float64, dan mengapa kode keuangan sebaiknya menghindari floating-point biner sama sekali.