Langsung ke konten utama

Perbandingan Nilai Float Terhadap Nilai Lain pada Bahasa C

Perkirakan hasil keluaran dari program C berikut ini:

// perbandingan nilai float 

// terhadap nilai lain pada

// bahasa C

#include<stdio.h>

 

int main()

{

float x = 0.1;

if (x == 0.1)

printf("IF");

else if (x == 0.1f)

printf("ELSE IF");

else

printf("ELSE");

}


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.

// perbandingan nilai float

// terhadap nilai lain pada

// bahasa C

#include<stdio.h>

 

int main()

{

float x = 0.1;

printf("%d %d %d", sizeof(x), sizeof(0.1), sizeof(0.1f));

return 0;

}


Output dari program adalah "4 8 4" dari hasil kompilator C, yang pada dasarnya mencetak ukuran dari floatdouble, 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 makna rangkap dua, pada sisi kanan dan float pada sisi kiri yang disimpan dalam format titik presisi float tunggal. Dalam kondisi ini, float akan dipromosikan menjadi tipe double. Format presisi double memiliki lebih banyak nilai 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:

// perbandingan nilai float

// terhadap nilai lain pada

// bahasa C

#include<stdio.h>

 

int main()

{

float x = 0.5;

if (x == 0.5)

printf("IF");

else if (x == 0.5f)

printf("ELSE IF");

else

printf("ELSE");

}

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).

Komentar

  1. Apakah ada cara untuk bisa membandingkan dunia nilai float yang sifatnya dapat setara atau senilai?

    BalasHapus
    Balasan
    1. Jawabannya adalah tidak bisa, karena cara menampilkan nilai float yang sifatnya relatif atau nilai yang direpresentasikan sifatnya dibulatkan, maka tidak bisa dilakukan perbandingan nilai float yang bersifat dasar atau aritmatik.

      Hapus
    2. Lakukan konversi tipe data float ke tipe data lain yang hasil representasinya tidak perlu melakukan pembulatan nilai seperti tipe data integer.

      Hapus
    3. Untuk dapat melakukan perbandingan nilai float atau bilangan berkoma, maka hal yang perlu dipertimbangkan untuk jadi dasar perbandingan nilai adalah ketepatannya dalam melakukan perbandingan. Contoh, jika dua buah angka nilainya adalah 3,1428 dan 3,1415, maka kedua nilai tersehing adalah bernilai sama pada presisi 0,01 namun akan menjadi tidak presisi jika ambang batas presisinya ditingkatkan lagi seperti 0,0001, maka kedua nilai tersebut tidak akan bernilai sama.

      Hapus
    4. Bisa, tapi untuk melakukan berbandingan dua nilai float tersebut pembuatan programnya agak sulit karena harus memerhatikan nilai presisi dari kedua data float yang akan dibandingkan. Tidak hanya itu, jika kedua nilai float tersebut tiba-tiba mengalami pembulatan nilai, maka hal tersebut juga akan berpengaruh pada hasil perbandingan dari kedua nilai tersebut.

      Hapus

Posting Komentar

Respon komentar 7 x 24 jam, so please be patient :D