Delphide bilmedigim bir konumu var?

Başlatan bunalmis, 02 Mart 2006, 00:05:59

z

Asagida iki fonksiyon goruyorsunuz.

Dat=300000 degeri icin

ilk fonksiyon  k=2475098112
ikinci fonksyon ise k=15360000000
sonucunu buluyor.

Bilmedigim bir ozellik mi var?

function cnv(dat:longword):longword;
var
k:double
begin
        k:=dat * 256 * 200;
        .......
        .......
end;

function cnv(dat:longword):longword;
var
k:double
begin
        k:=dat * 256;
        k:=K*200;
        ........
        .......
end;
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

Sorunum için ne diyorsunuz, farklı tipteki değişkenler arası işlemler mi neden oluyor bu hataya.

Eğer öyleyse tek satırda yazılan ifade 2 satıra dönüştürülürse neden farklı sonuc (doğru) veriyor?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

aykuto

Buradaki sorun delphi'nin hesaplama sırasıyla ilgili olabilir. Birinci fonksiyonda 300000*256*200 sayısını longword olarak çarpıp sonucu double'a çeviriyor olmalı. Bu durumda da hata vermesi çok doğal. Çünkü bu çarpım 15 milyar civarı bir sonuç veriyor. Halbuki longword'un kapasitesi maksimum 4 milyar civarı.
İkinci fonksiyonda 300000*256 işlemi longword sınırları içinde kalıyor. Dolayısıyla bu çarpım doğru olarak double'a çevriliyor. Sonrasındaki çarpım double ile bir sayının çarpımı olduğu için bu da doğru yapılıyor. Sanırım sorun bu. Başka mantıklı bir açıklama getiremiyorum.

otm

merhaba
aykuto nun söylediği doğru.
Sorunu çözmek için bunu real olarak tanımlaman lazım.ozaman sorun kalmaz

Ziya

Alıntı yapılan: "aykuto"Buradaki sorun delphi'nin hesaplama sırasıyla ilgili olabilir. Birinci fonksiyonda 300000*256*200 sayısını longword olarak çarpıp sonucu double'a çeviriyor olmalı. Bu durumda da hata vermesi çok doğal. Çünkü bu çarpım 15 milyar civarı bir sonuç veriyor. Halbuki longword'un kapasitesi maksimum 4 milyar civarı.
İkinci fonksiyonda 300000*256 işlemi longword sınırları içinde kalıyor. Dolayısıyla bu çarpım doğru olarak double'a çevriliyor. Sonrasındaki çarpım double ile bir sayının çarpımı olduğu için bu da doğru yapılıyor. Sanırım sorun bu. Başka mantıklı bir açıklama getiremiyorum.

Evet kesinlikle böyle.

ilk çarpmada 200 yada 256 yı 200. yada 256. şeklinde tanımlarsanız işlem doğrudan 64 bit floating point aritmetiğine dönüşüyor ve kayıpsız işlem sonucu k değişkenine aktarılıyor.
Bu günden sonra hiç kimse sarayda, divanda, meclislerde ve seyranda Türk dilinden başka dil kullanmaya. (13 Mayıs 1277) Karamanoğlu Mehmet Bey