Picproje Elektronik Sitesi

PROGRAMLAMA DİLLERİ => Delphi => Konuyu başlatan: z - 13 Şubat 2009, 10:44:41

Başlık: Neden 0 değil
Gönderen: z - 13 Şubat 2009, 10:44:41
y ve a real, b integer ve

a=42.4
b=42400 olmak uzere

y= a - b / 1000;

islemini yaptirdigimda y=-1.4224732503e-15 sonucu aliyorum.

Halbuki sonucun 0 cikmasi lazim.

Sorunun nedeni hakkinda fikriniz varmi?
Başlık: Neden 0 değil
Gönderen: Analyzer - 13 Şubat 2009, 11:03:32
Selam,

Floating point yapısından kaynaklanıyor. Ama bug olarak değerlendirmemek gerekir :

http://en.wikipedia.org/wiki/Pentium_FDIV_bug

http://en.wikipedia.org/wiki/Floating_point

http://pages.cs.wisc.edu/~smoler/x86text/lect.notes/arith.flpt.html

Analyzer
Başlık: Neden 0 değil
Gönderen: agora_meyhanesi42 - 13 Şubat 2009, 13:23:00
Çok afedersiniz ama sonucun nasıl sıfır çıkması lazım merak ettim. Ya matematik kanunları değişti ya benim kafam bulanık bir açıklama lütfen :)
Başlık: Neden 0 değil
Gönderen: ground - 13 Şubat 2009, 13:50:10
Alıntı yapılan: "agora_meyhanesi42"Çok afedersiniz ama sonucun nasıl sıfır çıkması lazım merak ettim. Ya matematik kanunları değişti ya benim kafam bulanık bir açıklama lütfen :)

işlemlerde öncelik sırası şöyledir:

Alıntı Yap1. Parantezli işlemler: ( ... )
2. Üs alma işlemi: 23 = 2.2.2 = 8
3. Ardışık işaretler: -(+(-(-3))) = -3
4. Bölme ( / ) veya çarpma ( . ) işlemi
5. Toplama ( + ) veya çıkarma ( - ) işlemi
Başlık: Neden 0 değil
Gönderen: z - 13 Şubat 2009, 14:15:27
0 = 42.4 - (42400 / 1000);
Başlık: Neden 0 değil
Gönderen: agora_meyhanesi42 - 13 Şubat 2009, 15:16:46
Yalnız dikkatinizi çekerseniz ilk mesajda hiç bir yerde parantez yok. Açıklamalar için sagolun bu arada
Başlık: Neden 0 değil
Gönderen: z - 13 Şubat 2009, 15:28:07
Parantezli hali ile parantezsiz hali ayni anlama gelir zaten.


Eger islemleri asagidaki gibi yapiyorsan vay haline.

42.4 - 42400 / 1000 =  (42.4 - 42400) / 1000
Başlık: Neden 0 değil
Gönderen: agora_meyhanesi42 - 13 Şubat 2009, 15:32:34
Neden vay halime insanların kafası bazen dönebilir. Ben bir yazılım şirketinde çalışıyorum programcıyım evet dediğinde haklısın parantezli veya parantezsiz hali aynı ama insanın beyni uçuyor bazen işte herkesin nasıl bir ruh hali içerisinde oldugu belli olmuyor :)

Kolay gelsin
Başlık: Neden 0 değil
Gönderen: z - 13 Şubat 2009, 15:42:52
Vay heline dememin sebebi, pek cok aritmetik islemin yapildigi bir programi yazarken bu tip hatalari yaparsan programi isler hale getirmek icin cok zaman kaybedersin.

Yoksa hepimiz benzer hatalari yapiyoruz.

Mesela benim en unlu hatam asembly programlamada # isaretini kullanmayi bazen unutmamdir. Bu durumda bu yazilimadki hatayi yakalamam bazen bir hatta iki gunumu alir.

Hatayi buldugumda # isaretini koymadigimi gorurum ve kendi kendime soz veririm tamam artik bundan sonraki meslek hayatimda bu hatayi asla yapmam derim ama nafile....
Başlık: Neden 0 değil
Gönderen: agora_meyhanesi42 - 13 Şubat 2009, 15:56:02
Sorunu visual basicde denedim vb.net ve vb 6.0 kullandıgım için delphi ile ilgilenmiyorum. Analyzer arkadaşın dediği gibiymiş floatdan dolayı

a = 42.4 - (CDbl(42400 / 1000))

bu işlem visual basicte dogru cıkıyor.  CDbl sayıyı Double yani delphideki floata çevirmek için kullanılan komut. Delphiyi pek bilmiyorum ama sanırım ondanda IntToFloat gibi bir şeydir eğer sen biliyorsan banada soyle bende ogrenmiş olayım :)