Rabu, November 06, 2019

Perbandingan nilai float terhadap nilai lain pada bahasa C

Perkirakan hasil keluaran dari program C berikut ini:

Output dari program sebelumnya adalah "ELSE IF" yang berarti ekspresinya "x == 0.1" dengan nilai return adalah false dan ekspresi "x==0.1f" dengan nilai return adalah true.

Perhatikan program berikut untuk memahami alasan dibalik output program sebelumnya.


Output dari program adalah "4 8 4" dari hasil compiler C, yang pada dasarnya mencetak ukuran dari float, double, dan float.

Nilai-nilai yang digunakan dalam ekspresi dianggap sebagai double (format float presisi double) kecuali 'f' ditentukan dibagian akhir. Jadi, ungkapan "X == 0,1" memiliki rangkap dua pada sisi kanan dan float yang disimpan dalam format titik presisi float tunggal pada sisi kiri. Dalam situasi seperti ini, float dipromosikan menjadi double. Format presisi double memiliki lebih banyak bit daripada format presisi tunggal.

Biner dengan nilai 0,110 dapat dinyatakan dengan (0,000110011001100110...) 2 yang akan naik hingga tak terbatas. Hal ini dikarenakan ketepatan float kurang dari dua kali lipat maka setelah titik tertentu (23 pada float dan 52 pada double) maka hasilnya akan terpotong. Karenaya setelah promosi float menjadi double (pada saat perbandingan) kompilator akan mengisi bit yang tersisa dengan nol. Karenanya didapatkan hasil yang berbeda dimana persamaan desimal keduanya akan berbeda. Misalnya,

Pada float
=> (0.1)10 = (0.00011001100110011001100)2
In double after promotion of float ...(1)
=> (0.1)10 = (0.00011001100110011001100000000000000000...)2
                                      ^ padding zeroes here
Pada double tanpa promotion ... (2)
=> (0.1)10 = (0.0001100110011001100110011001100110011001100110011001)2

Dapat dilihat hasil dari perbedaan persamaannya.
Karenanya, pernyataan 'if' tidak akan pernah bisa dieksekusi.

Catatan: promosi float ke double hanya akan menyebabkan ketidakcocokkan ketika nilai (seperti 0.1) menggunakan bit yang lebih presisi dari presisi tunggal. Contoh, program if pada bahasa c berikut ini:

Output:
IF

Di sini biner setara dengan 0,510 adalah (0,100000...) 2 (tidak ada presisi yang hilang pada tipe float dan double). Oleh karena itu jika kompilator memuat angka nol tambahan pada saat promosi maka akan didapatkan hasil yang sama dalam desimal setara dari sisi kiri dan kanan dibandingkan (x == 0,5).





Related Posts

Perbandingan nilai float terhadap nilai lain pada bahasa C
Oleh

"semoga yang memberikan komentar diberikan berkah kebaikan dari Allah, dijauhkan dari kejahatan, dan diberikan pahala ilmu dan amal jariyah dari sepenggal kata yang ia tinggalkan amiin :) "