float deger tam olarak sifirlanmiyor.

Başlatan Yuunus, 03 Mayıs 2020, 00:42:32

Yuunus

Merhaba; asagidaki atama islemlerini sirasiyla yaptiktan sonra degiskenin son halini ekrana yazdiriyorum ve ekrana
-0.000000 yaziyor.

float fval;

fval=0;
fval+=0.02;
fval-=0.02;
printf("%f\n",fval);

ancak siralamayi degistirip once degeri azaltip sonra artirirsam ekrana 0.000000 yaziyor.

fval=0;
fval-=0.02;
fval+=0.02;
printf("%f\n",fval);

neden, bunu nasil duzeltebilirm? hem atollic hemde Devc++ denedim durum ayni.
Not:0 sifirdir gibi bir cevap yazmayin lutfen.

esdevhk

Hocam 0.02f olarak yaparsanız düzelecektir.

Çünkü derleyici 0.02 sayısını double hassasiyet olarak aldığından o sayıyı 0.019999999 olarak islem yapıyor olabilir. Bu yüzden aslında eşit sayıları birbirinden çıkarmıyor ya da toplamıyorsunuz.

Özetle double/float hassasiyet sebebiyle bu sorun ortaya çıkmakta.

yas

Bence gayet normal. Çünkü toplama veya çıkartma işlemleri sonucu float değişkenin işaret biti değişiyor ve son hali kalıyor. Aşağıdakilerini incelerseniz anlayacaksınız.



http://www.puntoflotante.net/FLOATING-POINT-FORMAT-IEEE-754.htm

Yuunus