PanduanMengapa Pengonversi Titik Mengambang Gagal (dan Bagaimana Matematika Desimal Memperbaikinya)
Mengapa Pengonversi Titik Mengambang Gagal (dan Bagaimana Matematika Desimal Memperbaikinya)
Pahami mengapa titik mengambang biner menghasilkan sisa konversi yang aneh, kapan kesalahan tersebut penting, dan bagaimana aritmatika desimal atau rasional membuat pengonversi satuan dapat dipercaya.
Masalah klasik 0,1 + 0,2 memenuhi satuan
Kebanyakan CPU menyimpan bilangan non-integer dalam floating-point biner (IEEE 754). Pecahan yang terlihat sederhana dalam desimal—0,1, 0,001, 2,54—sering kali tidak dapat direpresentasikan secara tepat dalam biner. Nilai yang disimpan adalah perkiraan terdekat yang dapat direpresentasikan, dan aritmatika pada perkiraan mengumpulkan sisa-sisa kecil.
Konversi satuan mengalikan dan membagi nilai-nilai tersebut berulang kali. Ubah inci menjadi milimeter dan sebaliknya, atau liter menjadi meter kubik dan sebaliknya, dan Anda mungkin melihat 2,9999999997, bukan 3. Faktor konversi fisiknya tepat; representasi komputer tidak.
Bagi banyak tampilan, perbedaannya tidak terlihat setelah pembulatan. Untuk dosis yang berdekatan dengan keuangan, jalur alat CNC, luas lahan legal, atau pernyataan pengujian otomatis yang mengharapkan kesetaraan yang tepat, residu tersebut menjadi bug yang nyata.
Faktor konversi manakah yang tepat di atas kertas
Inci internasional tepat 25,4 mm. Kaki internasionalnya tepat 0,3048 m. Liternya tepat 0,001 m³. Satu sentimeter kubik sama dengan 1 mL dalam pengertian laboratorium biasa (1 cm³ = 10⁻⁶ m³). Ini adalah definisi, bukan pengukuran.
Jika perangkat lunak menyimpan 25.4 sebagai biner float, mungkin ada sedikit kesalahan sebelum konversi berjalan. Mengalikannya dengan faktor tak eksak lainnya akan menambah kesalahan. Pengujian bolak-balik yang menegaskan kesetaraan ketat kemudian gagal meskipun algoritme secara konseptual benar.
Suhu menambahkan offset: Celsius ↔ Kelvin menggunakan 273,15. Konstanta itu juga merupakan nilai desimal yang hanya diperkirakan oleh biner float. Konversi affine sangat sensitif karena penambahan offset yang tidak tepat akan mengubah setiap hasil.
Dimana kesalahan floating-point muncul dalam praktiknya
Pengonversi UI sering kali menyembunyikan masalah dengan membulatkan ke angka desimal yang tetap. Pengguna melihat hasil yang bersih dan tidak pernah memperhatikan kebisingan internal. Masalah muncul ketika sistem lain menggunakan float mentah: kernel CAD, ekspor CSV, atau pengujian unit yang membandingkan string dengan presisi penuh.
Konversi berantai memperbesar masalah. Berjalan mil → yard → kaki → inci → milimeter → meter dengan pelampung biner di setiap langkah lebih buruk daripada konversi satu mil → meter dengan faktor presisi tinggi. Setiap hop membulatkan kembali nilai perantara.
Kuantitas yang dikuadratkan dan dikuadratkan membuat kesalahan menjadi lebih buruk. Luas dan volume mengalikan skala panjang, sehingga kesalahan relatif kecil pada panjang menjadi dua atau tiga kali lebih besar secara relatif untuk luas atau volume ketika Anda memperluas (1+ε)ⁿ.
Alternatif desimal, rasional, dan titik tetap
Pustaka desimal (misalnya desimal.js, Big.js, atau desimal bahasa asli) menyimpan angka dalam basis 10. Faktor desimal eksak seperti 0,3048 dan 0,001 tetap tepat dalam presisi yang dipilih. Pengonversi satuan yang peduli terhadap kebenaran sering kali mengonversi melalui satuan dasar desimal.
Aritmatika rasional menyimpan faktor-faktor sebagai pecahan bilangan bulat. Jika 1 inci = tepat 127/5000 meter (karena 25,4 mm = 127/5000 m), perkalian dapat dibatalkan dengan tepat. Rasional ideal untuk konversi skala murni; offset masih memerlukan penanganan suhu yang hati-hati.
Matematika titik tetap menskalakan semuanya ke hitungan bilangan bulat dari detak terkecil—nanometer, mikroliter, atau seperseribu inci. Aritmatika bilangan bulat tepat sampai Anda meluap. Ini berfungsi dengan baik untuk domain dengan kuantum pengukuran yang jelas.
Aturan praktis untuk konverter yang dapat dipercaya
Simpan faktor hukum yang tepat sebagai desimal atau rasional, bukan sebagai pelampung biner yang diketik dengan tergesa-gesa. Konversikan input → basis → output dalam langkah sesedikit mungkin. Bulatkan hanya saat memformat untuk manusia, dan dokumentasikan mode pembulatan.
Jangan pernah menguji konverter dengan kesetaraan ketat pada float biner. Bandingkan dalam toleransi absolut atau relatif, atau bandingkan bentuk string desimal dengan presisi yang ditentukan. Lebih suka pengujian emas yang menggunakan pasangan pasti yang diketahui seperti 1 inci = 25,4 mm.
Jika Anda membuat UI kalkulator, tampilkan presisi yang cukup agar berguna, tetapi jangan terlalu banyak digit sehingga derau mengambang terlihat seperti sinyal. Alat panjang yang menampilkan dua belas desimal setelah mengkonversi melalui float mengiklankan kesalahan representasinya.
Saat pelampung biner masih baik-baik saja
Perbandingan kasar, permainan, visualisasi data, dan banyak simulasi ilmiah menoleransi kesalahan mengambang karena ketidakpastian model mengecilkan kesalahan representasi. Kuncinya adalah mengetahui toleransi Anda. Jika satu milimeter penting, pelampung perlu didisiplinkan atau diganti.
Akselerasi perangkat keras dan pipeline GPU sering kali memaksa float. Dalam kasus tersebut, pertahankan konversi otoritatif dalam desimal pada CPU atau server, dan perlakukan GPU float sebagai tampilan atau perkiraan perantara.
Rekayasa yang baik adalah mencocokkan representasi numerik dengan keputusan yang akan Anda buat dengan nomor tersebut. Konversi satuan untuk manufaktur, kedokteran, dan metrologi legal memerlukan perhitungan desimal atau rasional; widget cuaca yang mengubah suhu kota tidak. Jika ragu, pilih representasi yang lebih ketat—biaya kinerja desimal biasanya lebih kecil daripada biaya bug bolak-balik diam-diam.
Konverter terkait
Pertanyaan yang sering diajukan
Mengapa konversi bolak-balik mengubah nomor saya?
Titik mengambang biner tidak dapat mewakili banyak faktor desimal secara tepat. Setiap perkalian atau pembagian menambah kesalahan pembulatan kecil. Konversi bolak-balik melalui float sering kali gagal mengembalikan bit asli meskipun faktor konversi secara konseptual tepat.
Apakah presisi ganda cukup untuk konversi satuan?
Presisi ganda (float64) sudah cukup untuk banyak konversi sehari-hari setelah pembulatan tampilan, namun ini bukan pengganti faktor desimal yang tepat ketika Anda memerlukan perjalanan bolak-balik yang stabil, metrologi legal, atau pengujian otomatis yang ketat. Lebih memilih desimal atau rasional untuk konverter otoritatif.
Bagaimana cara membandingkan hasil konverter dalam pengujian?
Bandingkan dengan presisi yang dinyatakan, gunakan persamaan string desimal, atau tegaskan toleransi absolut dan relatif. Hindari mengharapkan persamaan biner yang tepat setelah beberapa langkah aritmatika.