![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
|
Не хочет его считать, методом проб и ошибок выяснил, что вываливается он на n=34 с ошибкой деления на 0.
Полный листинг: Код:
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, Math;
type
TfrmMain = class(TForm)
edtX: TLabeledEdit;
lblResult: TLabel;
btnCalc: TButton;
function Summ(x: Extended): Extended;
function Fact(n: integer): integer;
procedure btnCalcClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
frmMain: TfrmMain;
x: extended;
implementation
{$R *.dfm}
procedure TfrmMain.btnCalcClick(Sender: TObject);
begin
try
x := strtofloat(edtX.Text);
lblResult.Caption := 'erf(x) = ' + floattostr(summ(x));
except
lblResult.Caption := 'Ошибка!';
end;
end;
function TfrmMain.Fact(n: integer): Integer;
begin
if n > 1 then
Result := n * Fact(n - 1)
else
Result := 1;
end;
function TfrmMain.Summ(x: Extended): Extended;
var
n: Integer;
begin
Result := 0;
for n := 0 to 33 do
Result := Result + power( -1, n) * power(x, 2*n + 1)/(fact(n) * (2*n + 1));
Result := Result * 2 / sqrt(pi);
end;
end.Как лечить? |
|
#2
|
||||
|
||||
|
Нормально работает, без ошибок.
|
|
#3
|
|||
|
|||
|
м-м-м... а как ты n=34 получил? у тебя цикл до 33...
|
|
#4
|
||||
|
||||
|
Да нормально он получил. В дебаггере наверное посмотрел, а Дельфи соптимизироал как всегда.
|
|
#5
|
|||
|
|||
|
Ну тогда у меня единственная идея о переполнении Integer при вычислении факториала. т.е. только переход на Int64 спасет отца русской демократии.
|
|
#6
|
||||
|
||||
|
Не спасает
. |
|
#7
|
|||
|
|||
|
Переполнение. Причем очень хорошее ))
|
|
#8
|
||||
|
||||
|
а с каким параметром х зависает, а то я что не пробовал - везде работает нормально?
|
|
#9
|
||||
|
||||
|
С этим кодом естественно будет работать нормально. Увеличь верхнюю границу счетчика
.Можно что-то сделать с этим переполнением? |
|
#10
|
||||
|
||||
|
проблема именно в ф-ции факториала, именно при значении >33 она возвращает 0
если ее переработать так Код:
function TfrmMain.Fact(n: int64): Int64;
begin
if n > 1 then
Result := n * Fact(n - 1)
else
Result := 1;
end;то можно "поднять планку" немного выше Последний раз редактировалось YVitaliy, 15.12.2011 в 16:27. |
|
#11
|
|||
|
|||
|
|