Double ve Extended yada Currency sınırları

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Double ve Extended yada Currency sınırları

Mesaj gönderen vkamadan »

Merhaba,

543121229 * 6 işleminin sonucunu Delphi7 de Double , Currency , Extended , Int64, LongInt tiplerini denememe rağmen anlamlı olarak bulamadım sonucun 3258727374 çıkması lazım ama -1036239922 çıkıyor sınırlar dahilinde bir sonuç oysaki neden sorun var anlayamadım gitti.
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Mesaj gönderen vkamadan »

Merhaba,
Buradaki 6 değeri Integer bir değişkenden geliyor, 6 rakamaını atatığım Değişkenin tipini Real olarak değiştirdim sonuç istediğim gibi çıktı ama ne alaka demeden edemeyeceğim, bunu açıklayacak arakadşlara şimdiden teşekkürler.
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Int64'te soru

Mesaj gönderen sabanakman »

Bu bahsi geçen olay sadece Integer (32 bit) tipinde olacak bir olaydır. Int64 için böyle bir durum oluşmaz. Değeri okumak için muhakkak arada geçişi yaparken bir integer tipli değişken bu değeri üstleniyor (fonksiyon parametre tipi veya bir değişken) ve o noktada bu durum ortaya çıkıyordur. Eşitliğin sağ tarafında sadece Integer tipler kullanılsa bile eşitliğin sonucunu Integer vermeye çalışacaktır. (çok saçma ama durum bu)
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Mesaj gönderen vkamadan »

Merhaba ,

Kod: Tümünü seç

procedure TestEt;
var
i:integer;
rakam:Extended;
yazi:String;
deger:Integer;
begin
rakam:=0;
deger:=543121229;
 if edit2.Text<>'' then
   begin
      case qMusteripaket.AsInteger of
      0:edit3.Text:=Encrypt(edit2.Text,1682);
      1:edit3.Text:=Encrypt(edit2.Text,1238);
      end;
      rakam:=qMusterikulsay.AsInteger*Deger; //Bu rakam degişkeni hatalı sonuç veriyor
      yazi:=CurrToStr(rakam);
      edit4.Text:=Encrypt(yazi,(StrToInt64(edit2.Text) MOD 1229));
      Edit5.Text:=Encrypt(IntTosTR(qMusterienddate.AsInteger+Deger),(StrToInt64(edit2.Text) MOD 1229));
   end;
end;

Buda düzeltilmiş hali,

Kod: Tümünü seç

procedure TestEt;
var
i:integer;
rakam:Extended;
yazi:String;
deger:Integer;
begin
rakam:=0;
deger:=543121229;
 if edit2.Text<>'' then
   begin
      case qMusteripaket.AsInteger of
      0:edit3.Text:=Encrypt(edit2.Text,1682);
      1:edit3.Text:=Encrypt(edit2.Text,1238);
      end;
      rakam:=qMusterikulsay.AsFloat*Deger; //Sadece AsInteger yerine AsFloat ile cast ettim
      yazi:=CurrToStr(rakam);
      edit4.Text:=Encrypt(yazi,(StrToInt64(edit2.Text) MOD 1229));
      Edit5.Text:=Encrypt(IntTosTR(qMusterienddate.AsInteger+Deger),(StrToInt64(edit2.Text) MOD 1229));
   end;
end;

Yani dediğiniz gibi Integer * Integer sonucunu Integer olarak üretmeye çalışıyor çok saçma ama işin içine Float girince hemen hudutlar genişliyor çok aşırı mantıksız.
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Mesaj gönderen sadettinpolat »

problemle bir alakasi yok ama konuyla bir alakasi olabilir.

buyuk sayilari delphide kullanabilmek icin oldukca yararli bir kutuphane

http://www.delphiforfun.org/Programs/Li ... tegers.htm
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Mesaj gönderen vkamadan »

sadettinpolat yazdı:problemle bir alakasi yok ama konuyla bir alakasi olabilir.

buyuk sayilari delphide kullanabilmek icin oldukca yararli bir kutuphane

http://www.delphiforfun.org/Programs/Li ... tegers.htm

Çok yararlı oldu teşekkürler.
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Mesaj gönderen sabanakman »

vkamadan yazdı:Merhaba ,
Yani dediğiniz gibi Integer * Integer sonucunu Integer olarak üretmeye çalışıyor çok saçma ama işin içine Float girince hemen hudutlar genişliyor çok aşırı mantıksız.
Herhalde derleyici işlemin sonucuna değilde işlem içindeki veri tiplerine dikkat ediyor diye özet bir durum çıkarabiliriz.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

sabanakman yazdı:
vkamadan yazdı:Merhaba ,
Yani dediğiniz gibi Integer * Integer sonucunu Integer olarak üretmeye çalışıyor çok saçma ama işin içine Float girince hemen hudutlar genişliyor çok aşırı mantıksız.
Herhalde derleyici işlemin sonucuna değilde işlem içindeki veri tiplerine dikkat ediyor diye özet bir durum çıkarabiliriz.
Evet ve bence bu yanlış da değil. Integer ile integer'in çarpımının integer'den büyük olmasını beklememiz yanlış.
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Mesaj gönderen vkamadan »

fduman yazdı:
sabanakman yazdı:
vkamadan yazdı:Merhaba ,
Yani dediğiniz gibi Integer * Integer sonucunu Integer olarak üretmeye çalışıyor çok saçma ama işin içine Float girince hemen hudutlar genişliyor çok aşırı mantıksız.
Herhalde derleyici işlemin sonucuna değilde işlem içindeki veri tiplerine dikkat ediyor diye özet bir durum çıkarabiliriz.
Evet ve bence bu yanlış da değil. Integer ile integer'in çarpımının integer'den büyük olmasını beklememiz yanlış.
Bence olaya çarpma yada bölme girince atama yapılacak değişken dikkate alınamalı çünkü Integer ile Integer ı çarptığımızda Integer sınırını aşmak çokta zor değil gerçi yapmışlar böyle yapacak bişi yok artık bu kurala dikkat etmek gerekecek. Mesela Integer=Integer/Integer şeklinde bir kullanıma olması gerektiği gibi izin vermiyor tip hatalı diyor, ama çarpma durumunda tip uygun olduğu halde sonucu Integer veriyor düşünülmeli bence.
Volkan KAMADAN
www.polisoft.com.tr
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

vkamadan yazdı:.. Mesela Integer=Integer/Integer şeklinde bir kullanıma olması gerektiği gibi izin vermiyor tip hatalı diyor
Ancak / operatörünün özel bir anlamı var. Sonucunun her zaman float tipinden olması gibi. Integer div Integer hata vermez mesela.

Int64 = Integer * Integer işleminde compiler tam olarak istenen şeyi yapıyor.

Çünkü sonucun MaxInt'i aşacağını bilemez. Aynı zamanda tiplere Integer dediğin için Int64 * Int64 gibi de davranamaz.

Sen diyorsun ki Integer ile Integer sayı çarpılsın, eğer sonuç MaxInt'ten büyük ise Int64 * Int64 gibi davransın.

Ancak Pascal derleyici tam olarak tanımladığını yapar. Strict type checking dolayısıyla Integer çarpma işlemi yapar, kafasına göre karar vermez :) diyeyim.

Bir de sanırım Range Checking'i kapatıyorsun. Aksi halde bu çarpımda hata alman gerekirdi.
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Mesaj gönderen vkamadan »

Merhaba,
Tam oalrak mantığını bilmiyorum fikir yürüttüm açıklamalar için teşekkür ederim, demekki böyle oluyormuş.
Range Checking özelliğini kapatmadığımı düşünüyorum yani herhangi özel bir ayar değiştirmedim lakin yükeldiğim bir bilşene bunu yaptıysa ozaman durum farklı tabi. Nerden kapatılıp açılıyor peki bu özellik bunuda öğrenmiş olalaım
İyi çalışmalar.
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Bilgi

Mesaj gönderen sabanakman »

Kod: Tümünü seç

{$R+} or {$R-}
{$RANGECHECKS ON} or {$RANGECHECKS OFF}//var sayılan ON(+)
Bunun işlevi tam olarak bu işe mi yarar pek anlamadım (sanki dizi sınırlarını kontrol eder gibi bir işlevi varmış gibi bir anlam çıkardım). Her neyse, önemli olan bir bilgi daha ortaya çıktığı için bilgi dağarcığımız bu bilgiyle genişletiyor olmamız.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

Pardon range checking değil overflow checking olacaktı. :oops:

Tabii ki range checking dizi işlem taşması kontrolü için. :)
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

Overflow checking i açmak için unitin veya kodun başına {$Q+} koymak yeterli.
Cevapla