Proton da toplama hatası

Başlatan ihsan_atay, 24 Şubat 2010, 13:13:31

ihsan_atay

float sayıyı toplarken sonucu hatalı alıyorum. Örnek vermek gerekirse:

Dim a as float
a=a+0.1

yaptığımızda 0.1,0.2 den sonra 0.3 olması gerekirken 0.29 oluyor. Sebebi ne olabilir?

z

ondalikli sayilarin pek cogunun ikili karsiliklari sinirli uzunlukta bitlerle yazilamaz.

10luk sistemde 0.1 sayisinda sadece 1 ondalik varken bunun ikili karsiliginda sonsuz sayida ikilik var.

Sorun buradan kaynaklaniyor.

Eger ondaliktan kurtulabiliyorsan, mesela 0.1 i 10 ile carparsan ve islemleri tam sayi yurutursen buldugun en son sonucu da 10a bolersen ara islemlerdeki kesme hatalarindan kurtulmus olursun.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

ihsan_atay

Bu Float işlemden mi kaynaklanıyor yoksa derleyicinin azizliğimi ?

z

Her ikisinden de.

Float sayiyi ne kadar fazla bitle ifade edersen bu sorunlar iyice azalir.
Fakat sorun tam cozulmez. Cozumu float aritmetik rutinlerinde verileri ihtiyacin bir kac fazlasi bitle ifade etmek ve bunlara bakarak yuvarlatma yapmak.

Senin yapacagin fazla bir sey yok. Ondaliktan kurtulacagin bir sayi ile verilerini carp. Islemleri tam sayi devam ettir. En son adimda carptigin sayiya geri bol gerekiyorsa yuvarlama yap.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

ihsan_atay

C,Basic dillerinde de aynı problemi yaşayacağız yani sayın B.Ünalmış Hocam ?

Klein

Alıntı yapılan: "ihsan_atay"C,Basic dillerinde de aynı problemi yaşayacağız yani sayın B.Ünalmış Hocam ?
Tam olarak öyle değil. Evet hangi  derleyici olursa olsun , sonuçta 4 baytlık bir alana  sığdıracağınız sayının bir sınırı var.
Ancak  0.1 gibi noktadan sonra 1 hane olan bir sayıda böyle bir sorun yaşanması biraz derleyicinin beceriksizliği.

ihsan_atay


Maxim

kodun başına birde bunu yazıp deneyin bakalım

DECLARE FLOAT_DISPLAY_TYPE = LARGE

ihsan_atay

sayın maxiboost çok teşekkür ederim. Sorun kalmadı.

muhittin_kaplan

Çok Beceriksiz bir Derleyiciymiş :D