Dalam program yang diberikan mengapa saya mendapatkan hasil yang berbeda untuk masing-masing printf
?
#include <stdio.h>
int main()
{
float c = 4.4e10;
printf("%f\n", c);
printf("%f\n", 4.4e10);
return 0;
}
Dan itu menunjukkan output berikut:
44000002048.000000
44000000000.000000
4.4e10
adalahdouble
konstanta yang dikonversi kefloat
dalam inisialisasic
tetapi disimpan sebagaidouble
ketika diteruskanprintf
. Namun, Anda mungkin juga ingin tahu bahwa menambahkanf
akhiran membuatnya menjadifloat
konstan: Percetakan4.4e10f
akan menunjukkan nilai yang sama bahwa hasil dari inisialisasic
ke4.4e10f
.float
Konstanta yang membedakan daridouble
konstanta bisa penting untuk melakukan pekerjaan yang berkualitas dengan aritmatika titik-mengambang.double
kefloat
terjadi dalam bahasa C? Atau Anda ingin tahu nilai apa yang dihasilkan dari konversi, yaitu, apa pengaruh konversi itu? Atau sesuatu yang lain?C
kita digunakanprintf("%f",x)
untukfloat
danprintf("%lf",x)
untukdouble
. Kapan semuanya berubah? Dan bagaimana orang akan secara eksplisit mencetak (tunggal)float
-printf("%hf",x)
??%lf
di printf adalah hal yang sama dengan%f
. Afloat
dalam argumen variabel dikonversikan menjadidouble
oleh kompiler, sama seperti yangshort
dikonversi menjadiint
.Jawaban:
A
float
adalah tipe yang memegang angka floating point 32-bit, sedangkan konstanta4.4e10
merepresentasikan adouble
, yang memegang nomor floating point 64-bit (yaitu angka floating point double -precision)Ketika Anda menetapkan
4.4e10
untukc
, nilai4.4e10
tidak dapat direpresentasikan secara tepat (kesalahan pembulatan dalam parameter yang disebut mantissa), dan nilai terdekat yang mungkin (44000002048) disimpan. Ketika diteruskan keprintf
, itu dipromosikan kembali kedouble
, termasuk kesalahan pembulatan.Dalam kasus kedua, nilainya adalah
double
sepanjang waktu, tanpa penyempitan dan pelebaran, dan ini merupakan kasus bahwa adouble
dapat mewakili nilai dengan tepat.Jika ini adalah perilaku yang tidak diinginkan, Anda dapat mendeklarasikan
c
sebagaidouble
sedikit lebih presisi (tetapi berhati-hatilah bahwa Anda masih akan mencapai batas presisi pada akhirnya).sumber
Anda sebenarnya mencetak nilai dari dua jenis berbeda di sini.
Dalam kasus pertama Anda menetapkan nilai ke variabel tipe
float
. Presisi afloat
kira-kira 6 atau 7 angka desimal, jadi kecuali jika nilainya dapat direpresentasikan dengan tepat Anda akan melihat nilai terdekat yang dapat diwakili oleh tipe itu.Dalam kasus kedua Anda melewati konstanta
4.4e10
yang bertipedouble
. Jenis ini memiliki sekitar 16 digit desimal presisi, dan nilainya berada dalam kisaran itu, sehingga nilai pastinya dicetak.sumber