Satu hal yang saya ingin melihat akan menjadi pengakuan bahwa double
untuk float
harus dianggap sebagai konversi pelebaran, sementara float
untuk double
adalah penyempitan (*). Itu mungkin tampak kontra-intuisi, tetapi pertimbangkan apa arti sebenarnya tipe-tipe ini:
- 0,1f berarti "13.421.773,5 / 134.217.728, plus atau minus 1 / 268.435.456 atau lebih".
- 0,1 benar-benar berarti 3,602.879.701.896.397 / 36.028.797.018.963.968, plus atau minus 1 / 72.057.594.037.927.936 atau lebih "
Jika seseorang memiliki double
yang memegang representasi terbaik dari kuantitas "sepersepuluh" dan mengubahnya menjadi float
, hasilnya akan menjadi "13.421.773,5 / 134.217.728, plus atau minus 1 / 268.435.456 atau lebih", yang merupakan deskripsi nilai yang benar.
Sebaliknya, jika seseorang memiliki float
yang memegang representasi terbaik dari kuantitas "sepersepuluh" dan mengubahnya menjadi double
, hasilnya akan menjadi "13.421.773,5 / 134.217.728, plus atau minus 1 / 72.057.594.037.927.936 atau lebih" - tingkat akurasi yang tersirat yang salah dengan faktor lebih dari 53 juta.
Meskipun standar IEEE-744 mensyaratkan bahwa matematika titik-mengambang dilakukan seolah-olah setiap angka titik-mengambang mewakili kuantitas numerik tepat tepat di pusat jangkauannya, yang tidak boleh dianggap menyiratkan bahwa nilai-nilai titik-mengambang sebenarnya mewakili yang tepat jumlah numerik. Sebaliknya, persyaratan bahwa nilai-nilai diasumsikan berada di pusat rentang mereka berasal dari tiga fakta: (1) perhitungan harus dilakukan seolah-olah operan memiliki beberapa nilai tepat tertentu; (2) asumsi yang konsisten dan terdokumentasi lebih bermanfaat daripada yang tidak konsisten atau tidak berdokumen; (3) jika seseorang akan membuat asumsi konsisten, tidak ada asumsi konsisten lain yang cenderung lebih baik daripada mengasumsikan kuantitas mewakili pusat kisarannya.
Kebetulan, saya ingat sekitar 25 tahun yang lalu, seseorang datang dengan paket numerik untuk C yang menggunakan "berbagai jenis", masing-masing terdiri dari sepasang pelampung 128-bit; semua perhitungan akan dilakukan sedemikian rupa untuk menghitung nilai minimum dan maksimum yang mungkin untuk setiap hasil. Jika seseorang melakukan perhitungan berulang yang panjang dan muncul dengan nilai [12.53401391134 12.53902812673], orang dapat yakin bahwa sementara banyak digit presisi hilang dari kesalahan pembulatan, hasilnya masih bisa dinyatakan secara wajar sebagai 12,54 (dan tidak t benar-benar 12.9 atau 53.2). Saya terkejut saya belum melihat adanya dukungan untuk jenis seperti itu dalam bahasa mainstream, terutama karena mereka tampaknya cocok dengan unit matematika yang dapat beroperasi pada berbagai nilai secara paralel.
(*) Dalam praktiknya, sering kali bermanfaat untuk menggunakan nilai presisi ganda untuk memegang perhitungan menengah ketika bekerja dengan angka presisi tunggal, jadi harus menggunakan tipografi untuk semua operasi semacam itu bisa mengganggu. Bahasa dapat membantu dengan memiliki tipe "fuzzy double", yang akan melakukan komputasi sebagai ganda, dan dapat dengan bebas dilemparkan ke dan dari tunggal; ini akan sangat membantu jika fungsi yang mengambil parameter tipe double
dan kembali double
dapat ditandai sehingga mereka secara otomatis menghasilkan kelebihan yang menerima dan mengembalikan "fuzzy double" sebagai gantinya.