Perbandingan Nilai Float Bahasa C Terhadap Nilai Lainnya
// 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");
}
// 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;
}
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.
// 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");
}
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).
- Karakter Aritmatika pada Bahasa C dan C++ [klik]
- 2 Jenis Utama Tipe Konversi pada Bahasa C [klik]
- 4 Jenis Utama Kelas Penyimpanan pada Bahasa C [klik]
- 6 Fakta tentang Variabel Static Bahasa C [klik]
- 4 Kondisi Nilai Default Variabel Static pada Bahasa C [klik]
- Pemahaman Volatile Tahap 1 pada Bahasa C [klik]
- Pemahaman Volatile Tahap 2 pada Bahasa C [klik]
Apakah ada cara untuk bisa membandingkan dunia nilai float yang sifatnya dapat setara atau senilai?
BalasHapusJawabannya 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.
HapusLakukan konversi tipe data float ke tipe data lain yang hasil representasinya tidak perlu melakukan pembulatan nilai seperti tipe data integer.
HapusUntuk 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.
HapusBisa, 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