Saya akan mengulangi deskripsi sebagai "kode yang mengubah tipe ke representasi yang berbeda untuk tujuan melakukan sesuatu yang bisa dilakukan dengan baik atau lebih baik dalam aslinya dan kemudian mengubahnya kembali. Ada banyak situasi di mana mengubah sesuatu menjadi sebuah tipe yang berbeda, menindaklanjutinya, dan mengubahnya kembali sepenuhnya tepat dan kegagalan untuk melakukannya akan menghasilkan perilaku yang salah.
Sebagai contoh di mana konversi baik:
Seseorang memiliki empat float
nilai tanda arbitrer yang besarnya mungkin berbeda dengan faktor hingga 1.000, dan seseorang perlu menghitung jumlah dalam 0,625 unit di tempat terakhir. Mengubah keempat nilai menjadi double
, menghitung penjumlahan, dan mengubah hasilnya kembali float
menjadi jauh lebih efisien daripada pendekatan apa pun yang menggunakanfloat
sendiri.
Nilai titik-mengambang paling akurat hingga 0,5 unit di tempat terakhir (ULP). Contoh ini akan mengharuskan bahwa kesalahan pembulatan kasus terburuk tidak lebih dari 25% di atas kesalahan kasus terburuk optimal. Menggunakan ganda akan menghasilkan nilai yang akan akurat dalam 0,5001 ULP. Sementara persyaratan 0,625 ULP mungkin tampak dibuat-buat, persyaratan seperti itu sering penting dalam algoritme pendekatan-berturut-turut. Semakin ketat batas kesalahan ditentukan, semakin rendah persyaratan iterasi kasus terburuk.
Sebagai contoh di mana konversi buruk:
Seseorang memiliki angka floating-point, dan ingin menghasilkan string yang akan mewakili nilainya secara unik. Salah satu pendekatan adalah mengonversi angka menjadi string dengan jumlah digit tertentu, mencoba mengubahnya kembali, dan melihat apakah hasilnya cocok.
Tapi ini sebenarnya pendekatan yang buruk. Jika string desimal mewakili nilai yang berada hampir tepat di titik tengah antara dua nilai floating-point, itu cukup mahal untuk metode string-to-float untuk menjamin bahwa itu akan selalu menghasilkan semakin dekatfloat
, dan banyak metode konversi seperti itu tidak dapat menegakkan jaminan seperti itu (antara lain, melakukan hal itu dalam beberapa kasus akan mengharuskan membaca semua digit angka, bahkan jika itu panjangnya miliaran digit).
Jauh lebih murah untuk suatu metode untuk menjamin bahwa ia akan selalu mengembalikan nilai yang berada dalam 0,5625 unit di tempat terakhir (ULP) dari nilai yang diwakili. Rutin format desimal-ke-string yang kuat "reversibel" harus menghitung seberapa jauh nilai output dari nilai yang benar, dan terus mengeluarkan digit hingga hasilnya berada dalam 0,375 (ULP) jika tidak 0,25 (ULP). Jika tidak, ini dapat menghasilkan string yang beberapa metode konversi akan proses dengan benar, tetapi metode konversi lainnya tidak.
Lebih baik terkadang mengeluarkan angka yang mungkin tidak "perlu" daripada menghasilkan nilai yang mungkin disalahtafsirkan. Bagian kuncinya adalah bahwa keputusan berapa digit harus menjadi output harus dibuat berdasarkan perhitungan numerik yang terkait dengan proses output, bukan pada hasil dari upaya satu metode tertentu untuk mengubah string kembali ke angka.