Kod: Tümünü seç
var
test: double;
abc: string;
begin
abc := '0,4';
test := strtofloat(abc);
if test > strtofloat(abc) then showmessage('ok');
Kod: Tümünü seç
var
test: double;
abc: string;
begin
abc := '0,4';
test := strtofloat(abc);
if test > strtofloat(abc) then showmessage('ok');
Kod: Tümünü seç
var
test: double;
abc: string;
begin
abc := '0,4';
test := strtofloat(abc);
if test > strtofloat(abc) then
showmessageFmt('%.4f (Size:%d) > %.4f (Size:%d)', [test, SizeOf(Test), strtofloat(abc), SizeOf(strtofloat(abc))]);
end;
Kod: Tümünü seç
0,4000 (Size:8) > 0,4000 (Size:10)
Kod: Tümünü seç
showmessage(FormatFloat('0.00000000000000000000000000', test));
- Fonksiyon dönüşü hangi tipte ise aynı tipte bir değişken kullanmak kuraldır. Elma <> Armut yani. ikisi de meyve olabilir ama farklı@mrmarman yazdı:- Yani Double yerine Extended kullan..
Hocam dediğim işlemi yaparsanız problem olduğunu anlarsınız. Yani kodun sonuna:mrmarman yazdı:@Hakan CAN bu bir problem değil...
- Fonksiyon dönüşü hangi tipte ise aynı tipte bir değişken kullanmak kuraldır. Elma <> Armut yani. ikisi de meyve olabilir ama farklı@mrmarman yazdı:- Yani Double yerine Extended kullan..İkisi de floating point olabilir ama taşınma şekilleri farklı.
- Bu farklılıklar saklanan değer için rezerve edilen yerler dikkate alınarak oluşur. Veriler karşılaştırılırken içindeki verinin tamamı dolu varsayılarak bütün olarak değerlendirmeye alınır...
Kod: Tümünü seç
showmessage(FormatFloat('0.00000000000000000000000000', test));
Kod: Tümünü seç
Sonuc:=0;
for i:=1 to 10 do Sonuc:=Sonuc+(1/i);
Sonuc2:=0;
for i:=10 downto 1 do Sonuc2:=Sonuc2+(1/i);
if Sonuc=Sonuc2 then WriteLn('Eşit') else WriteLn('Eşit Değil');
@Hakan Can yazdı:showmessage(FormatFloat('0.00000000000000000000000000', test));
Delphi Help, FormatFloat function hk. yazdı:Formats a floating point value.
Unit
SysUtils
Category
floating point conversion routines
Delphi syntax:
function FormatFloat(const Format: string; Value: Extended): string; overload;
Kod: Tümünü seç
showmessage(FormatFloat('0.00000000000000000000000000', strtofloat(abc)));
Hocam maalesef hata yapan sizsiniz.mrmarman yazdı:@Hakan Can
- Hala aynı hatayı yapıyorsun...
@Hakan Can yazdı:showmessage(FormatFloat('0.00000000000000000000000000', test));Delphi Help, FormatFloat function hk. yazdı:Formats a floating point value.
Unit
SysUtils
Category
floating point conversion routines
Delphi syntax:
function FormatFloat(const Format: string; Value: Extended): string; overload;Kod: Tümünü seç
showmessage(FormatFloat('0.00000000000000000000000000', strtofloat(abc)));
Kod: Tümünü seç
var
test: Double;
abc: string;
begin
abc := '0,4';
test := strtofloat(abc);
if test > 0.4 then showmessage('ok');
Hocam benim dediklerim aynen geçerli. Sizin dediğinizi ta başından beri doğru algıladım ama maalesef benim vurgulamak istediğimi siz algılayamadınız.mrmarman yazdı:- Evet aslında şimdi birşeyin farkına vardım. O da hatanın ne olduğunu henüz algılamamış olmanız...![]()
- Ben mi ifade edemiyorum yoksa görmek o kadar zor mu ? Önce değişkenler arası hatalı aktarım yapıyorsunuz, sonra bu hatalı sonuçla olması gerekeni karşılaştırma yapıp bana soruyu yineliyorsunuz..
- Verdiğiniz kod bloğunda ve nicelerinde sorun ne idi, test değişkeninin double tipinde, strtofloat(abc) fonksiyonunun dönüşü Extended tipinde oluşu. Bu iki farklı tipi birbirine aktarmak hatalı işlemdir.
- Önce test := strtofloat(abc); deyip, yani asıl veriyi bozduktan sonra if ile karşılaştırmaya tabi tutuyorsunuz.![]()
- Ben de ısrarla aktarma işleminin aynı tipte değişken <-> fonksiyon sonuç ataması olması gerektiğinin altını tekrar tekrar çiziyorum.
- Bir de şunu deneyin o zaman... test değişkeninin tipini olması gereken tip olan extended yapın.
- Bir önceki mesajımda FormatFloat fonksiyonunun EXTENDED tip döndürdüğünü söylemiş olmama rağmen neden halen DOUBLE tipinde olan test değişkenine Extended sonuç döndüren FormatFloat fonksiyonu ile değer aktarıyorsunuz ve bundan yola çıkarak yapılan karşılaştırmanın tutarsızlığına bakıyorsunuz, buna mana veremiyorum.
@Hakan Can yazdı:Sonuçta problem Extended veya Double tip olayı değil. Gerçek sayılarla ilgili işlemlerde Delphi beklenenden farklı sonuçlar üretebiliyor (gerçi bir kısmı mantıklı).
@Hakan Can yazdı:Hem atamalarda aynı tip kullanılacak diye bir kural yok ki. Yani bu Pascal'dan beri böyle. Hem niye Double değişkene Extended atanmasın ki? Küsüratını atar ve atamasını yapar. Zaten mantıksız olsa derlerken hata mesajı verir. Sonuçta böyle bir atama mantıksız değil.
Kod: Tümünü seç
Fundamental real types
Type Range Significant digits Size in bytes
Real48 2.9 x 10^-39 .. 1.7 x 10^38 11-12 6
Single 1.5 x 10^-45 .. 3.4 x 10^38 7-8 4
Double 5.0 x 10^-324 .. 1.7 x 10^308 15-16 8
Extended 3.6 x 10^-4951 .. 1.1 x 10^4932 19-20 10
Comp -2^63+1 .. 2^63 -1 19-20 8
Currency -922337203685477.5808.. 19-20 8
922337203685477.5807
Generic real types
Type Range Significant digits Size in bytes
Real 5.0 x 10^-324 .. 1.7 x 10^308 15-16 8