float değerleri karşılaştırma problemi

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
ahmet_sinav
Üye
Mesajlar: 263
Kayıt: 17 Nis 2004 07:44
Konum: İzmir Yeşilyurt Ulu Cami
İletişim:

float değerleri karşılaştırma problemi

Mesaj gönderen ahmet_sinav »

merhabalar arkadaşlar ilginç problemle karşılaştım sizlerede sormak istedim.
sistem : firebird 2.5, fibplus ve delphi xe2 (updated) windows7 64 bit.

Kod: Tümünü seç

if dYMBP['HKS_PUANI'].AsFloat >= 0.96 then
    extHKS := 1.05
else
    extHKS := 1; 
extHKS = 1 dönüyor :!:

tabloda dYMBP['HKS_PUANI'].AsFloat değeri 0.96 ve HKS_PUANI alanı numeric(2,2).
eğer 0.96 değerini tabloda ve kodda 0.95 olarak değiştirirsem doğru çalışıyor .

Kod: Tümünü seç

if dYMBP['HKS_PUANI'].AsFloat >= 0.95 then
    extHKS := 1.05
else
    extHKS := 1; 
extHKS = 1.05; dönüyor :?:

0.95 değerini tabloda ve kodda tekrar 0.96 olarak yapıp aşağıdaki gibi uyarlarsam yine çalışıyor

Kod: Tümünü seç

extDeg = 0.96
if dYMBP['HKS_PUANI'].AsFloat >= extDeg then
    extHKS := 1.05
else
    extHKS := 1; 
extHKS = 1.05; dönüyor :?:

yani karşılaştırma işlemini bir değişkene atarsam çalışıyor.

aşağıdaki koduda denedim bu da çalışıyor

Kod: Tümünü seç

if math.CompareValue(dYMBP['HKS_PUANI'].AsFloat,0.96) in [0,1] then
    extHKS := 1.05 
extHKS = 1.05; dönüyor :?:

problem nedir anlayamadım. birden fazla bilgisayarda 0.96 değeri ile ilgili debug yaptım (sistem aynı bilgisayarlar farklı) yine aynı sonuçları verdi? Sizce bu bir bug'mıdır. veri tabanı ile ilgisi olacağını zannetmiyorum zira değeri watch edince 0.96 değerini görüyorum. 0.95 0.97 sayılarını denedim hep doğru çalışıyor ama 0.96 değeri hep hatalı sonuç üretiyor. sanki 0.96 değerini hafizada alloc edemiyor gibi dicem ama 0.95 nasıl çalışıyor o zaman :N(
Yardımlarınız için şimdiden teşekkürler;
İmam Süleyman Yakub <==> Molla Mustafa Mansur
Kullanıcı avatarı
ahmet_sinav
Üye
Mesajlar: 263
Kayıt: 17 Nis 2004 07:44
Konum: İzmir Yeşilyurt Ulu Cami
İletişim:

Re: float değerleri karşılaştırma problemi

Mesaj gönderen ahmet_sinav »

0,86 değerini denedim aynı 0,96 gibi çalışıyor. 0,76 , 0,66 değerlerini denedim normal çalışıyor. Enteresan :shock:
İmam Süleyman Yakub <==> Molla Mustafa Mansur
Kullanıcı avatarı
ahmet_sinav
Üye
Mesajlar: 263
Kayıt: 17 Nis 2004 07:44
Konum: İzmir Yeşilyurt Ulu Cami
İletişim:

Re: float değerleri karşılaştırma problemi

Mesaj gönderen ahmet_sinav »

.asFloat ' ı .asCurrency olarak deneyince normal çalışıyor. :)
İmam Süleyman Yakub <==> Molla Mustafa Mansur
Kullanıcı avatarı
ahmet_sinav
Üye
Mesajlar: 263
Kayıt: 17 Nis 2004 07:44
Konum: İzmir Yeşilyurt Ulu Cami
İletişim:

Re: float değerleri karşılaştırma problemi

Mesaj gönderen ahmet_sinav »

konuyu embarcadero quality central'a taşıdık buradan takip edip yorum yapıp konunun güncel kalmasını sağlayabilirsiniz.
rapor no : 107818
http://qc.embarcadero.com/wc/qcmain.aspx?d=107818
teşekkürler;
İmam Süleyman Yakub <==> Molla Mustafa Mansur
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3077
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: float değerleri karşılaştırma problemi

Mesaj gönderen sabanakman »

Bilgisayar sistemleri tamamen 2'li (Binary) sayı sistemi üzerinde çalışır (+5V=1, 0V=0). Sayı sistemleri aritmetiğinde 10'lu sayı sistemindeki değerlerin 2'li sayı sisteminde karşılıklarını elde etme konusunda biraz alıştırma yapabilirsiniz. Bilgisayar üzerinde sonsuz boyutta bellek ve hız olmadığından, ondalıklı sayılar 2'li sistemde mükemmel olarak kesin bir karşılık bulamaz. İlgili değer milyonda bir veya milyarda bir de olsa bazı kırpmalar ve yuvarlamalara maruz kalır. Bu bizim için önemsiz bir değer bozulması olsa da eşitlik gibi bir kıyasa girecek değer için önemli olabiliyor. Bu durumda belli bir ondalık basamağından ötesi ihmal edilerek çözüme ulaşılır ve Currency bu işi otomatik olarak gerçekleştiren bir sayı tipidir. Yanlış hatırlamıyorsam Currency 4 ondalık basamağından sonrasını dikkate almayan bir tiptir.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
mkysoft
Kıdemli Üye
Mesajlar: 3103
Kayıt: 26 Ağu 2003 12:35
Konum: Berlin
İletişim:

Re: float değerleri karşılaştırma problemi

Mesaj gönderen mkysoft »

Bu durumun işlemciden kaynaklandığını düşünüyorum. Intel işlemcilerdeki floating point unit (kayar nokta)'den kaynaklı bir durum. Ben float yerine extend tipinde kullanıyorum bu alanı. Float sayıyı yuvarlasınız bile karşılaştığınızda bu hatayı almaya devam edeceksiniz. Ben delphi 7 sürümünden beri aynı sorunla karşılaşıyorum.
Kullanıcı avatarı
ahmet_sinav
Üye
Mesajlar: 263
Kayıt: 17 Nis 2004 07:44
Konum: İzmir Yeşilyurt Ulu Cami
İletişim:

Re: float değerleri karşılaştırma problemi

Mesaj gönderen ahmet_sinav »

birde aşağıdakini deneyin. :?:

Kod: Tümünü seç

var
  sonuc : Extended;
  deger : Extended;
  deger2 : double;
  a : double;
begin
 
  a := 0.96;
  deger := 0.96;

  if deger >= 0.96 then
    sonuc := 1
  else
    sonuc := 1.05;

  deger2 := 0.96;

  if deger2 >= 0.96 then
    sonuc := 1
  else
    sonuc := 1.05;

  if deger >= a then
    sonuc := 1
  else
    sonuc := 1.05;

  if deger2 >= a then
    sonuc := 1
  else
    sonuc := 1.05;

end;
İmam Süleyman Yakub <==> Molla Mustafa Mansur
Cevapla