Bukan 46 tapi 23. Itu kesalahan yang baru saya sadari kemarin. Apabila suatu pecahan desimal dengan 23 angka di belakang koma dikalikan dengan pecahan desimal dengan 23 angka di belakang koma juga, maka jumlah angka di belakang koma pada hasil kalinya adalah 23+23=46. Saya terlalu ceroboh untuk menyadari hal ini.
Saya mengerjakan tugas akhir yang pada intinya membuat perkalian floating-point bekerja pada suatu field programmable gate array (kumpulan gerbang logika yang hanya mengenal bilangan biner). Field Programmable Gate Arrays dapat diprogram menggunakan bahasa pemrograman yang bernama VHDL. Selain VHDL, bisa juga digunakan bahasa pemrograman yang lebih baru yang bernama Verilog. Setiap gerbang logika hanya mengenal angka 0 dan 1, karena itu disebut basis biner.
Terkadang saya berpikir, apa jangan-jangan saya sebenarnya merancang kalkulator?
Nah, tugas saya adalah untuk merancang dengan menggunakan VHDL, sistem penjumlahan dan perkalian floating-point. Floating-point adalah semacam format data biner untuk memfasilitasi kalkulasi notasi ilmiah pada perhitungan biner, berbentuk sederetan bit
Bagi yang tidak mengerti notasi ilmiah itu seperti apa, saya coba jelaskan secara ringkas sebagai berikut:
Contoh notasi ilmiah:
2.5 x 10^5
2.5 mewakili angka pecahan. Nilai pecahan ini tidak bisa kurang dari 1 atau melebihi angka 9.9999999999...
kalau melebihi maka harus disesuaikan lagi.
5 mewakili angka eksponen.
Jadi berapakah nilai sebenarnya yang diwakili oleh notasi di atas?
Lihat bahwa 5 mewakili angka eksponen. Jadi 10^5 = 10 pangkat 5, alias 10x10x10x10x10 = 100000. Dikalikan dengan angka pecahan di depannya, diperoleh 2.5 x 100000 = 250000. Jadi 2.5 x 10^5 mewakili angka 250000.
Notasi ilmiah seperti ini umum digunakan di kalangan ilmuwan, dan cocok untuk menggambarkan suatu bilangan yang terlalu panjang untuk ditulis, seperti bilangan yang terlalu kecil atau terlalu besar. Coba tuliskan jarak dari bumi ke bintang merah Gliese 581c (193 trilyun km) dengan notasi angka biasa: 193000000000000. Ribet kan? Maka dibikinlah notasi ilmiahnya: 1.93 x 10^14.
OK sekian dulu untuk notasi ilmiah.
Floating-point pada standar IEEE untuk 32 bit terdiri atas 1 bit sign, 8 bit eksponen, dan 23 bit fraksi/pecahan. Bit sign menentukan apakah floating-point akan bernilai negatif (1) atau tidak (0). Bit eksponen menentukan nilai eksponen, dan bit pecahan menentukan angka-angka di belakang koma pada desimal, sementara angka di depan koma bisa 0 atau 1, tapi tidak ditampilkan pada bit floating-point. Untuk lebih jelasnya silahkan baca standar IEEE pada link di atas.
Nah, kebodohan saya adalah, menganggap bahwa perkalian dengan masing-masing bilangan pengali dan dikali mempunyai 23 angka di belakang koma menghasilkan bilangan dengan 23 angka di belakang koma juga. Padahal seharusnya 23+23, yakni 46 angka di belakang koma. Akibatnya, saya menganggap bahwa bit ke-23 adalah bit terakhir sebelum koma, bukannya bit ke-46! Saya menstandarkan angka-angka tersebut pada patokan bit ke-23, bukannya bit ke-46. Saya menuliskan 6099 baris kode VHDL yang sama sekali tidak berguna dan sia-sia!
Saya kerja 4 hari pagi dan malam hanya untuk mendapati bahwa saya melakukan kesalahan fundamental dan harus mengulang semuanya...



