为什么只能算到170的阶乘(而170的阶乘只是E306,而Extended能容下E4932呢。)? ( 积分: 0 )

  • 主题发起人 主题发起人 wdycwopt
  • 开始时间 开始时间
W

wdycwopt

Unregistered / Unconfirmed
GUEST, unregistred user!
为什么只能算到170的阶乘(而170的阶乘只是E306,而Extended能容下E4932呢。)?


function factorial(n:extended):extended;
begin
result:=1;
while n>1 do
begin
result:=result*n;
n:=n-1;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
num:extended;
begin
num:=strtoint(edit1.Text);
if num>170 then
showmessage('输入的数据不能大于170!')
else
edit2.Text:=Floattostr(factorial(num));
end;
 
为什么只能算到170的阶乘(而170的阶乘只是E306,而Extended能容下E4932呢。)?


function factorial(n:extended):extended;
begin
result:=1;
while n>1 do
begin
result:=result*n;
n:=n-1;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
num:extended;
begin
num:=strtoint(edit1.Text);
if num>170 then
showmessage('输入的数据不能大于170!')
else
edit2.Text:=Floattostr(factorial(num));
end;
 
唉,那是因为你的代程序限制了啊,事实上这样的代码可以算到1754的阶乘:
function factorial(n: Integer): extended;
begin
result := 1;
while n > 1 do
begin
result := result * n;
Dec(n);
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
num: Integer;
begin
num := strtoint(edit1.Text);
if num > 1754 then
showmessage('输入的数据不能大于1754!')
else
edit2.Text:=Floattostr(factorial(num));
end;
 
楼主的程序我试了一下,和dreamisx的一样,也可以算到1754的阶乘
 
不行啊,我按dreamisx说的去做,也只能算到170的阶乘,171以上的就出现“arithmetic operation resulted in an overflow ”,是什么意思?
 
接受答案了.
 
后退
顶部