![]() |
|
|
Регистрация | << Правила форума >> | 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
|
||||
|
||||
![]() Нормально работает, без ошибок.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#3
|
|||
|
|||
![]() м-м-м... а как ты n=34 получил? у тебя цикл до 33...
|
#4
|
||||
|
||||
![]() Да нормально он получил. В дебаггере наверное посмотрел, а Дельфи соптимизироал как всегда.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#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
|
|||
|
|||
![]() |