Değişkenlerde sınır aşımı sorunu :?:

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
qamyoncu
Üye
Mesajlar: 266
Kayıt: 12 Tem 2008 04:30

Değişkenlerde sınır aşımı sorunu :?:

Mesaj gönderen qamyoncu »

Merhabalar..

Matematiksel işlemler yapıyorum programım ile. Ancak değişkenin sınırı dışındaki sayıları hesaplamakta sorun yaşıyorum. Hesap makinelerinde falan E19 yada benzer ifadeler görüyorum. Ne oldukları hakkında pek fikrim yok ancak yapmak istediğim; belli bir değerden sonra ifadeyi a,bcd*10^x cinsinden göstermek. Değişken olarak variant kullanıyorum, ancak longint veya extended tipine de döndürebilirim. Bir fikriniz varsa yardım bekliyorum.. Teşekkürler..
Batuhan TAŞDÖVEN
'Yükseldikçe küçülen bir uçurtma..'
mkysoft
Kıdemli Üye
Mesajlar: 3110
Kayıt: 26 Ağu 2003 12:35
Konum: Berlin
İletişim:

Re: Değişkenlerde sınır aşımı sorunu :?:

Mesaj gönderen mkysoft »

E19 zaten 10^x oluyor.
qamyoncu
Üye
Mesajlar: 266
Kayıt: 12 Tem 2008 04:30

Re: Değişkenlerde sınır aşımı sorunu :?:

Mesaj gönderen qamyoncu »

hımm.. Peki, örneğin 16777216 sayısı 2'nin 24. kuvvetidir. Bu sayıyı nasıl 2^24 diye gösterebilirim acaba?

Ayrıca E'nin kullanımı hakkında biraz daha geniş bilgi verebilir misiniz?
Batuhan TAŞDÖVEN
'Yükseldikçe küçülen bir uçurtma..'
emin_as
Üye
Mesajlar: 559
Kayıt: 01 Eki 2008 10:05
Konum: izmir
İletişim:

Re: Değişkenlerde sınır aşımı sorunu :?:

Mesaj gönderen emin_as »

E bilimsel gösterim diye geçer.
http://en.wikipedia.org/wiki/Scientific_notation

Delphide bunu kullanmak için floatstr yi kullanabilirsin.
http://www.delphibasics.co.uk/RTL.asp?Name=FloatToStrF
qamyoncu
Üye
Mesajlar: 266
Kayıt: 12 Tem 2008 04:30

Re: Değişkenlerde sınır aşımı sorunu :?:

Mesaj gönderen qamyoncu »

+Anladım hocam saolun verdiğiniz bilgiler için. Double tipindeki değişkene yeterince büyük sayı girdiğinde (15 basamaktan büyük) otomatik olarak düzenliyor kendini. Teşekkür ediyorum.

+İnternette bir çok yerde 2^8 sayısını 256 ya çevirmeyi gösteriyor ancak tam tersi fonksiyonu bulamadım.. Kendim mi yazmalıyım? Şuan hazırlamaya çalıştığım programda zaten bütün fonksiyonları kendim yazdım(determinant hariç :lol: ) Üşendiğimden değil ancak bana hız kazandıracağını düşünüyorum bu şekilde.. :oops:
Batuhan TAŞDÖVEN
'Yükseldikçe küçülen bir uçurtma..'
emin_as
Üye
Mesajlar: 559
Kayıt: 01 Eki 2008 10:05
Konum: izmir
İletişim:

Re: Değişkenlerde sınır aşımı sorunu :?:

Mesaj gönderen emin_as »

2^8 için 256 geçerlidir, ama mesela 230 için 2^? gibi bir sayı bulamazsın. O nedenle genelde basit shift ifadelerini kullanman gerekebilir.

256 = (1 shl 8 ) olarak düşünebilirsin.

Kod: Tümünü seç

function ikiussu(sayi:  integer):integer;
var
  i : integer;
begin
  result:=-1;
  for i:=0 to 31 do
    if (sayi = (1 shl i)) then 
    begin
       result:=i;
       break;
   end;
end;
 
Kullanım

Kod: Tümünü seç

k:=256;
z:=ikiussu(k);
if z > -1 then showmessage(k+ ' =   2 ussu '+z)
else showmessage(k+'  sayısı için 2 üssü x degeri yoktur.');
qamyoncu
Üye
Mesajlar: 266
Kayıt: 12 Tem 2008 04:30

Re: Değişkenlerde sınır aşımı sorunu :?:

Mesaj gönderen qamyoncu »

Kusura bakmayın bir süre yoktum..

Kod: Tümünü seç

procedure asalcarpan(s:integer);
var
i:integer;
begin
form1.ListBox1.Clear;
i:=2;
if s=1 then
  begin
    form1.ListBox1.items.Add('1');
    exit;
  end;

  while i<=round(s) do
    begin
      if (s mod i=0) then
        begin
        form1.listbox1.items.add(inttostr(i));
        s:=round(s/i);
        end
      else
        i:=i+1;
    end;
end;
aradığım kod buydu. Anlatamadım ama yaptım..:) saolun yardımlarınız için
Batuhan TAŞDÖVEN
'Yükseldikçe küçülen bir uçurtma..'
Cevapla