Double ve Extended yada Currency sınırları
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
Double ve Extended yada Currency sınırları
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.
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
www.polisoft.com.tr
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.
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
www.polisoft.com.tr
- sabanakman
- Kıdemli Üye
- Mesajlar: 3081
- Kayıt: 17 Nis 2006 08:11
- Konum: Ah bi Antalya olaydı keşke (Ankara)
Int64'te soru
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. - .
_________________
Derin olan kuyu değil kısa olan iptir. - .
Merhaba ,
Buda düzeltilmiş hali,
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.
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;
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;
Volkan KAMADAN
www.polisoft.com.tr
www.polisoft.com.tr
- sadettinpolat
- Moderator
- Mesajlar: 2131
- Kayıt: 07 Ara 2003 02:51
- Konum: Ankara
- İletişim:
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
buyuk sayilari delphide kullanabilmek icin oldukca yararli bir kutuphane
http://www.delphiforfun.org/Programs/Li ... tegers.htm
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
www.polisoft.com.tr
- sabanakman
- Kıdemli Üye
- Mesajlar: 3081
- Kayıt: 17 Nis 2006 08:11
- Konum: Ah bi Antalya olaydı keşke (Ankara)
Herhalde derleyici işlemin sonucuna değilde işlem içindeki veri tiplerine dikkat ediyor diye özet bir durum çıkarabiliriz.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.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
_________________
Derin olan kuyu değil kısa olan iptir. - .
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ış.sabanakman yazdı:Herhalde derleyici işlemin sonucuna değilde işlem içindeki veri tiplerine dikkat ediyor diye özet bir durum çıkarabiliriz.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.
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.fduman yazdı: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ış.sabanakman yazdı:Herhalde derleyici işlemin sonucuna değilde işlem içindeki veri tiplerine dikkat ediyor diye özet bir durum çıkarabiliriz.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.
Volkan KAMADAN
www.polisoft.com.tr
www.polisoft.com.tr
Ancak / operatörünün özel bir anlamı var. Sonucunun her zaman float tipinden olması gibi. Integer div Integer hata vermez mesela.vkamadan yazdı:.. Mesela Integer=Integer/Integer şeklinde bir kullanıma olması gerektiği gibi izin vermiyor tip hatalı diyor
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

Bir de sanırım Range Checking'i kapatıyorsun. Aksi halde bu çarpımda hata alman gerekirdi.
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.
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
www.polisoft.com.tr
- sabanakman
- Kıdemli Üye
- Mesajlar: 3081
- Kayıt: 17 Nis 2006 08:11
- Konum: Ah bi Antalya olaydı keşke (Ankara)
Bilgi
Kod: Tümünü seç
{$R+} or {$R-}
{$RANGECHECKS ON} or {$RANGECHECKS OFF}//var sayılan ON(+)
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
_________________
Derin olan kuyu değil kısa olan iptir. - .