Forum

Float cinsinde nede...
 
Bildirimler
Hepsini Temizle

Float cinsinde neden boyle ?

1 Yazılar
1 Üyeler
0 Reactions
898 Görüntüleme
(@SavasKAPLAN)
Gönderiler: 244
Reputable Member
 

Normal şartlarda if(a2==0.2) (true) else (false) türünde bir sorgu yaptığınızda sonucun false dönmesi gerekir. Sebebi a2 olarak belirlediğiniz değişkenin float tipli olup eşitlik karşılaştırmasına yazdığımız 0.2 nin double olarak belleğe işlenmesidir. Float nokta sonrası 7 basamak, double 15 basamak hassasiyetindedir.

a1 ve a2 örneğinden devam edecek olursak;

Sizin yazdığınız

a1 = 0.1f = 0.1000000

a2 = 02f = 0.2000000 değişkenleri yanlarına yazdığım sayılara denk gelir.

a3'ten a9'a kadar olan değişkenler tip belirtilmediği ve sayılar noktalı olduğu için toplama işlemlerinde sayıları double olarak ele alıp işleme devam edeceklerdir.

Yani a3 = a1 + a2 yazdığınızda beklediğiniz şey sonucun 0.1000000 + 0.2000000 = 0.3000000 olmasıdır ancak bilgisayar sistemlerindeki hesaplamalar işlemcilerin aritmetik işlem kabiliyeti gereği reel matematikten farklı olabiliyor. (Diferansiyel/Limit)

 a3 = a1 + a2 işleminin sonucu 0.10000000149011612 + 0.20000000298023224 = 0.30000000044704836 bu şekildedir. Sıfırların bittiği noktadan sonraki sekizinci basamaktaki sayılar a8'de onluk sisteme göre basamak atladığından 0.8 yerine 0.80000001 ifadesiyle karşılaşıyorsunuz.

Olayın özü bu şekilde ve bu problem genel bir sorun, düzeltmeler genelde kütüphane ve modüllerle yapılabiliyor. Örnek java'da bigdecimal fonksiyonu. Konuyla ilgili aklıma gelenler bu kadar daha ayrıntılı araştırmak isterseniz veya isteyenler ieee 754 standartlarını inceleyebilir ancak konu ileri elektrik-elektronik ve matematik bilgisi gerektiriyor, bunuda belirtelim. 

Son olarak şunu da belirtmem gerekir-ki C sharp'ın assembly'si hakkında bilgi sahibi olmadığım için işlerin .net tarafında bu şekilde yürüyüp yürümediğinden emin değilim. 

Şu linkte C# için nasıl düzeltileceği anlatılmış, inceleyebilirsiniz.

 
Gönderildi : 02/12/2012 10:26

Paylaş: