Menyambung kritik tentang floating point, tulisan ini sebagai tanggapan artikel Bernaridho I. Hutabarat (BIH), rubrik Know How PC edisi 06/2009 dengan judul ‘Menguak Misteri Floating Point’. Terdapat beberapa kekeliruan berpikir maupun kedangkalan fakta di situ. Tentu hanya yang menarik perhatian saya.
Pertama, mengenai sejarah IEEE 754. Meskipun publikasi IEEE 754 (draft) baru dilakukan tahun 1985, tetapi sejak tahun 1976 Intel telah merancang math-coprocessor berdasarkan format tersebut [1]. Tak heran karena Intel-lah pemrakarsa standar IEEE 754. Intel sendiri telah memproduksi math-co 8087 pada 1980 (dikenal pula dengan keluarga x87) [2]. Penyerapan standar berlangsung cepat, mengingat pada tahun yang sama (1985) Borland telah mengeluarkan Turbo Pascal 3.02 yang mendukung 8087 [3].
Di majalah, fakta di atas sama sekali tidak tergali oleh BIH. Yang disinggung adalah Intel memproduksi 80386 dan 80387 pada 1987, bahkan keliru menyatakan baru pada Turbo Pascal 6.0 yang memakai 80387. Dengan bermodal Google sebentar saja didapat fakta sejarah lebih akurat.
public class main { |
Lalu mengenai contoh program (di atas) untuk untuk menunjukkan “bukti awal ketidakbenaran mitos” mengenai ketidakcermatan perangkat keras komputer. Ada 3 hal yang menunjukkan kekeliruan berpikir seperti berikut.
- Mengapa menggunakan Java ? Rasanya aneh sekali pembuktian perangkat keras dilakukan lewat platform yang bertujuan ‘machine independent’. Format floating point di Java tentu tunduk kepada spesifikasi Java, dengan implementasi di level perangkat keras tergantung interpreter atau virtual machine yang tersedia. Apalagi disebut di bagian lain artikel, “fokus pada Intel dan Windows”. Ingat, semboyan Java adalah “compile once run anywhere”.
- BIH melakukan penyimpangan (abuse) dari spesifikasi single-precision, di mana fraction-nya adalah 23-bit (7 s/d 8 digit) [4]. Tentu akan menghasilkan sampah bila dipaksa menjadi 9 digit.
- Program di atas lebih menunjukkan bagaimana compiler (atau interpreter) menerjemahkan konstanta (0.1) ke format biner, ketimbang efek dari perangkat keras. Lihat contoh-contoh hasil disassembly di bawah.
Contoh hasil disassembly program Java. Pencetus IEEE 754, William Kahan, pernah membahas masalah serius operasi floating point di Java, “How Java’s floating-point hurts everyone everywhere.” [5]
public static void main(java.lang.String[]); |
Contoh hasil disassembly program C (gcc –O2). Tidak terlihat ada operasi floating point di sini, melainkan mencetak langsung angka.
float f = 0.1; |
Contoh disassembly program Pascal (fpc –O2). Di FreePascal dan Delphi operasi floating point menggunakan format double extended sehingga terjadi konversi dari 32-bit (dword ptr) menjadi 80-bit (tbyte ptr). Namun demikian, penentuan konstanta awal tetap dilakukan oleh compiler.
f := 0.1; |
Sebagai penutup, pada dasarnya format IEEE 754 mempunyai kompleksitas tersendiri. Perlu pemahaman dan pengujian yang memadai untuk dapat menggunakannya secara benar. Tidak sekedar mengetahui bagaimana format tersebut dibentuk, tetapi juga peran compiler dalam menerjemahkan konstanta dan kode mesin yang dihasilkan. Memahani secara parsial dan pembuktian yang serampangan hanya akan menghasilkan kompleksitas yang tidak perlu.
Lego Haryanto said
Cuman komentar di point no. 2, … itu mungkin yg BIH ingin tunjukkan, lho. Mungkin sengaja dibikin banyak decimal digits sehingga hasil print menunjukkan garbage.
Lalu yang disassembled version dari C code itu, kok ada yg aneh ya. Kemungkinan besar 32-bit float nya itu yg bernilai: 0x3fb99999, tapi itu jadinya bukan 0.1 tapi 1.45.