Для Лейбница и Эллера у меня получился вот такой код:
Код:
function TForm1.PI_leib(e: Extended; var Cnt : Integer): Extended;
var
I : Integer;
Sng : Integer;
dx : Extended;
begin
Cnt := 0;
I := 1;
Sng := 1;
dx := 1;
Result := 0;
While Abs(dx) > Abs(e) Do
Begin
Result := Result + dx;
Inc(Cnt);
Inc(I,2);
Sng := Sng * (-1);
dx := Sng/I;
End;
Result := Result * 4;
end;
function TForm1.PI_eiler(e: Extended; var Cnt : Integer): Extended;
var
I : Integer;
dx : Extended;
begin
Cnt := 0;
Result := 0;
I := 1;
dx := 1;
While Abs(dx) > Abs(e) Do
Begin
Result := Result + dx;
Inc(Cnt);
Inc(I);
dx := 1/Sqr(I);
End;
Result := Sqrt(Result*6);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Cnt : Integer;
P : Extended;
begin
P := PI_leib(0.000001,Cnt);
//P := PI_eiler(0.000001,Cnt);
ShowMessage(Format('Pi = %.6f; %d steps.',[P,Cnt]));
end;
Последняя процка - просто пример вызова с выводом результата.
Чем выше задашь точность (чем меньше значение е), тем точнее считает. Только вот кол-во итераций получается большим...