Konuyu Oyla:
  • Derecelendirme: 5/5 - 2 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Double Alan Karşılaştırma
#1
Lightbulb 
Bir soruda benden Smile
Aşağıdaki kodu compile etmeden cevabı tahmin edebilirmisiniz ve neden öyle olduğunu?
program Project1;
{$APPTYPE CONSOLE}
{$R *.res}
uses
 System.SysUtils,System.Math;
 var
 a,b: Double;
 i:Byte;
begin
 try
    a:=1;
   b:=0;
   for I := 1 to 10 do  b:=b+0.1;
   
writeln('a nın değeri = ',a);
    Writeln;
    Writeln('b nin değeri = ',b);
    Writeln;
   if a=b then  writeln('A ve B değerleri eşit') else writeln ('A ve B değerleri Eşit Değil');
   Readln;
  except
   on E: Exception do
     Writeln(E.ClassName, ': ', E.Message);
 end;
end.

“Do. Or do not. There is no try.”
Cevapla
#2
Değişken tipi double olduğundan dolayı ortaya çıkan bir problem. Firebird veritabanından php ile veri çekip hesaplama yaptırırken karşılaşmıştım bu sorun ile. Double yerine Currency yada float kullandığınızda sorun ortadan kalkıyordu, sebebi de sanırım double veri tipinde 1 bit kaydırmamı ne oluyordu hesaplarken (Bende 10 katı gibi bi fark ortaya çıkıyordu, çıkan değeri 10 ile çarpınca gerçek sonuca ulaşıyordum) fakat tam hatırlayamadım.

İlave olarak bu kodun C de düzgün çalışacağını tahmin ediyorum.
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
WWW
Cevapla
#3
(14-08-2017, Saat: 09:42)esistem Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.Değişken tipi double olduğundan dolayı ortaya çıkan bir problem. Firebird veritabanından php ile veri çekip hesaplama yaptırırken karşılaşmıştım bu sorun ile. Double yerine Currency yada float kullandığınızda sorun ortadan kalkıyordu, sebebi de sanırım double veri tipinde 1 bit kaydırmamı ne oluyordu hesaplarken (Bende 10 katı gibi bi fark ortaya çıkıyordu, çıkan değeri 10 ile çarpınca gerçek sonuca ulaşıyordum) fakat tam hatırlayamadım.

İlave olarak bu kodun C de düzgün çalışacağını tahmin ediyorum.

#include <stdio.h>
int main()
{
double d = 0.;

for (int k = 0; k < 10; ++k)
d += .1;

if (d == 1.)
printf("dogru\n");
else
printf("yanlis\n");

printf("d = %f\n", d);
}
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız. buradan kontol edebilirsiniz c dilinde de aynı

“Do. Or do not. There is no try.”
Cevapla
#4
Dilden bağımsız, tamamen "floating point" ile alakalı bir konu. 
Her programcının floating-point'leri kullanırken 2 kere dikkatli olması gerektiğinin bir örneği daha Smile

Bu ve bunun gibi sayfalar okunmalı:
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
There's no place like 127.0.0.1
WWW
Cevapla
#5
sayın @SimaWB ninde bahsettiği gibi dilden bağımsız konu
iki gerçek sayıyı eşitlik karşılaştırmasına soktuğumuzda,
matemetiksel durumda bizim için eşit
işlemcinin yaptığı eşitlik karşılaştırmasına göre eşit değil
bir çok işlemci de gerçek sayı eşitliği örnek 8 bytelık bir alanda 64 bitin 64 ü de
eşit olacak ki eşit çıkacak tek bir bit farkı bile eşit değil olarak çıkacak.
delphide math unitinde bu iş için bir fonksiyon var
function SameValue(const A, B: Extended; Epsilon: Extended): Boolean;
begin
 if Epsilon = 0 then
   Epsilon := Max(Min(Abs(A), Abs(B)) * ExtendedResolution, ExtendedResolution);
 if A > B then
   Result := (A - B) <= Epsilon
 else
   Result := (B - A) <= Epsilon;
end;
if SameValue(a,b) then Writeln('Eşit') else Writeln('Değil');

“Do. Or do not. There is no try.”
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  UPDATE ile Ikı Tablo da alan guncellemek !!! OZCANK 27 3.232 21-12-2018, Saat: 21:19
Son Yorum: FiRewaLL



Konuyu Okuyanlar: 1 Ziyaretçi