0

Visualisasi Apung IEEE-754

Lihat dengan tepat bagaimana angka desimal disimpan sebagai float IEEE-754 — bit tanda, bit eksponen, dan bit mantissa — dan mengapa angka seperti 0,1 tidak disimpan secara tepat.

Buy Me a Coffee at ko-fi.com
Memproses... 0%
Normalisasi
Menghitung bias eksponen
Memperluas bit mantissa
Selesai

Hasil

Setiap angka floating-point yang disimpan komputer — angka JavaScript, float C, float Python — dikodekan 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 jenis angka default hampir setiap bahasa, menggunakan 1 bit tanda, 11 bit eksponen, dan 52 bit mantissa. Alat ini mengambil angka desimal apa pun yang Anda ketik, menyandikannya dalam lebar mana pun menggunakan encoder float DataView/ArrayBuffer milik browser — mesin yang sama yang menjalankan kode Anda — dan mewarnai setiap bit berdasarkan wilayah tempatnya.

Pengkodean itu sendiri mengikuti tiga langkah, dan alat ini menelusuri semuanya, bukan hanya menampilkan bit terakhir. Pertama, normalisasi: bilangan tersebut ditulis ulang menjadi 1.mantissa × 2^eksponen, dengan tepat satu digit bukan nol sebelum titik biner (angka yang terlalu kecil untuk itu mendapat perlakuan subnormal, tanpa awalan implisit 1). Kedua, bias eksponen: karena bidang eksponen harus menyimpan eksponen positif dan negatif sebagai bilangan tak bertanda, bias tetap (127 untuk presisi tunggal, 1023 untuk presisi ganda) ditambahkan sebelum bidang ditulis dalam biner. Ketiga, mantissa pecahan diperluas sedikit demi sedikit dengan metode klasik “kalikan dua, ambil bagian bilangan bulat sebagai bit berikutnya, pertahankan sisanya” — diulangi hingga bidang mantissa penuh, di mana bit sisa memutuskan apakah hasilnya dibulatkan ke atas atau ke bawah (bulat setengah ke genap, default IEEE-754).

Inilah sebabnya mengapa angka biasa seperti 0,1 tidak disimpan secara tepat. Dalam biner, 0,1 adalah pecahan berulang (0,0001100110011…, selamanya), jadi tidak ada mantissa berhingga yang dapat menampungnya dengan tepat — ia harus dibulatkan ke suatu tempat. Enkode 0,1 sebagai float 32-bit dan baca kembali bit-bitnya, dan Anda tidak mendapatkan 0,1 kembali: Anda mendapatkan tepat 0,100000001490116119384765625. Presisi ganda memiliki 29 bit mantissa lebih banyak untuk dikerjakan, sehingga kesalahan pembulatannya jauh lebih kecil, tetapi juga tidak nol — 0,1 karena ganda 64-bit sama persis dengan 0,1000000000000000055511151231257827021181583404541015625. Alat ini menghitung nilai tersimpan secara tepat dengan aritmatika bilangan bulat besar (tanpa pintasan floating-point) sehingga jarak antara apa yang Anda ketik dan apa yang sebenarnya disimpan oleh perangkat keras tidak pernah disembunyikan atau diperkirakan.

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