XE2 yüklü bir bilgisayarda, rxcalcedit kullandığım bir projede aşağıdaki kodu çalıştırdığımda ele alınan 2 değerin farklı olduğunu gösteriyor.
formda 3 adet rxcaledit mevcut.
Form aktif hale geldiğinde edt1'in içeriğine 5,55 yazıyorum. Sonra da aşağıda kodu bir buton çalıştırıyorum
Yapılan işlem : edt1 içindeki değeri double tanımlı deger1 içerisine aktarılıyor. edt2 nin değeri deger1(değişken değeri)-edt1.value yapılıyor, sonuc 0 olarak ekrana geliyor.
showmessage satırında ise 5,55-5,55=-1.77809156287623E-16 gösteriyor
son satırda ise (if satırında) deger1 içindeki değer ile edt1 içindeki değerin farklı olduğunu gösteriyor.
Bu hata neden kaynaklanabilir, nasıl çözülebilir.
procedure TForm1.Button1Click(Sender: TObject);
var deger1:Double;
begin //edt1.value=5,55
deger1:=edt1.Value; //edt1 içindeki sayısal ifade deger1 değişkenine aktarılıyor
edt2.Value:=deger1-edt1.Value; //deger1 değişkeninden edt1 içindeki sayısal değer çıkartılıyor ve edt2 içine yazdırılıyor 5,55-5,55=0
ShowMessage(FloatToStr(deger1)+'-'+FloatToStr(edt1.Value)+'='+FloatToStr(deger1-edt1.Value)); //deger1(5,55)-edt1.value(5,55)=-1.77809156287623E-16 veriyor
if (deger1<>edt1.Value) then //iki değerin birbirinden farklı olduğunu kabul ediyor ve edt3 içeriğine 1 yazıyor
edt3.Value:=1;
end;
XE2 sayısal değer karşılaştırma sorunu
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
- sabanakman
- Kıdemli Üye
- Mesajlar: 3081
- Kayıt: 17 Nis 2006 08:11
- Konum: Ah bi Antalya olaydı keşke (Ankara)
Re: XE2 sayısal değer karşılaştırma sorunu
Bilgisayar ondalıklı sayıların, ikili sayı sistemindeki karşılıklarıyla çalışırken çok önemsenmeyecek düzeylerde kayıplar ve yuvarlamalar yapmaktadır. Zira mükemmel değer için sonsuz boyutta ram ve işlem gücü gerekir. Haliyle bu mümkün olmadığından mevcut sistemin de böyle bir yan etkisi olmaktadır. Mesela -1.77809156287623E-16 (-1,78 çarpı 10 üzeri eksi onaltı) sayısının gerçekteki karşılığı sıfıra çok yakın bir değerdir. Çünkü -1,77 sayısını 16 sıfırlı bir rakama bölmek gerekecek bu da sıfırın yanında çok önemsiz bir değer olacaktır. Problem ise kıyaslamalarda meydana geldiği için bu değeri yuvarlayacak bir fonksiyon geliştirin veya Double sayı tipi yerine Currency sayı tipine geçiş yapın. Currency tipli değerlerde 4. basamaktan sonraki değerler pek ele alınmadığı için benzeri bir sıkıntı yaşamazsınız.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
_________________
Derin olan kuyu değil kısa olan iptir. - .
Re: XE2 sayısal değer karşılaştırma sorunu
Bu bir kere benimde başıma gelmişti, sorun hep string e çevirme işlemlerinde çıkıyordu. ayrıca double ve extended hassasiyetleri farklı, atamalarda sıkıntı yani kayan nokta değerlerinde sıkıntı olabilir. Eğer hassasiyet öenmliyse, kullandığınız tüm değişken tipleri aynı olsun, component larında değişken tiplerini inceleyin. Ayrıca hassasiyet çok fazla önemli değilse sınırlandırın. Mesela ceza evi iaşe programımda kuruş için 4 hane istemişlerdi, ben işlemleri buna göre yapmıştım. Değerleri mümkün olduğunca çevrim yapmadan kullanın, ekrana yazacaksanızda ekrana formatlayarak yazdırın, ama değeri sayı olarak saklayın
kolay gele
kolay gele
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5
Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5
Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!