Liczby fermata

0

Witam. Mam problem z takim programem. Gdy wpisze liczbę 232 to mi wywala błąd "invalid floating point operation", a według mnie powinno się to dziać dopiero przy 264. Liczby 2^32-1 i mniejsze działają poprawnie.

 procedure TForm2.Button1Click(Sender: TObject);
  var
    x,y,b:double;
    d,c,a:int64;
    p:boolean;
    start,stop:TDateTime;
    h,m,s,ms:word;
  begin
    listBox1.Items.Clear();
    try
      x:=strtofloat(Edit1.Text);
      y:=strtofloat(Edit2.Text);
      except on EConvertError do
      showmessage('Błąd! Wpisz liczbę.');
    end;
    if ((x<0)or (y<0)) then  showmessage('Wpisana została liczba ujemna. Program może działać niepoprawnie.');
    if (x>y) then  showmessage('Zły przedział. Liczba "a" nie może być większa od liczby "b".');
    start:=time;
    if x<=3 then Listbox1.Items.Add('3');
    a:=1;
    repeat
      a:=2*a;
      b:=(power(2,a))+1;
      p:=true;
      d:=trunc(b);
      c:=3;
      repeat
        if d mod c=0 then p:=false;
        c:=c+2;
      until ((c>sqrt(b)) or (p=false));
      if ((b>=x) and (b<=y) and (p=true)) then Listbox1.Items.Add(floattostr(b));
    until b>y;
    stop:=time;
    DecodeTime(stop-start,h,m,s,ms);
    Edit3.Text:=inttostr(s)+' s '+inttostr(ms)+' ms';
  end;

EDIT: Dodam że program ma wyliczać liczby pierwsze Fermata. Mój liczy te liczby Fermata, a potem sprawdza czy są one pierwsze. Pierwsza liczba Fermata która nie jest liczbą pierwszą, to właśnie 232+1, dlatego zależy mi aby dało się to obliczyć. Kolejna to 264+1, ale tego już nie da rady, bo int64 nie pomieści ;D

1

const One64:Int64=1;
b:=(One64)shl(n); // b=2^n;

0

W linii

const One64:Int6=1; 

wyskakuje błąd składni:

Undeclared identifier: 'Int6'

Jeśli to ma znaczenie, to używam Delphi XE2.

1

Int64 miało być zapewne.
Edit: QWord ma większą pojemność (to taki unsigned int64), lecz nie wiem czy Delphi je wspiera (FPC na pewno).

1 użytkowników online, w tym zalogowanych: 0, gości: 1