Double Alan Karşılaştırma - Baskı Önizleme +- Delphi Can (https://www.delphican.com) +-- Forum: Delphi (https://www.delphican.com/forumdisplay.php?fid=3) +--- Forum: İpuçları (https://www.delphican.com/forumdisplay.php?fid=24) +--- Konu Başlığı: Double Alan Karşılaştırma (/showthread.php?tid=1249) |
Double Alan Karşılaştırma - masteryoda - 12-08-2017 Bir soruda benden 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. Double Alan Karşılaştırma - esistem - 14-08-2017 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. Cvp: Double Alan Karşılaştırma - masteryoda - 14-08-2017 (14-08-2017, Saat: 09:42)esistem Adlı Kullanıcıdan Alıntı: 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. #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); }http://cpp.sh/ buradan kontol edebilirsiniz c dilinde de aynı Double Alan Karşılaştırma - SimaWB - 14-08-2017 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 Bu ve bunun gibi sayfalar okunmalı: http://floating-point-gui.de/ Double Alan Karşılaştırma - masteryoda - 14-08-2017 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'); |