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