Ich bin grade dabei ein Programm zu schreiben mit dem man Pi ausrechnen kann.
Der Algorithmus ist relativ einfach und der funktioniert auch ganz gut http://de.wikipedia.org/wiki/Vietas_Pro ... eiszahl_Pi.
Aber nach 15 Durchläufen wird die Zahl nicht genauer sondern ungenauer, irgendwann ist es nicht mehr 3,14159 sondern 2,8...
Ich gehe davon aus, dass es an den Nachkommastellen liegt (bei real 15 oder?) und das Programm mit gerundeten Werten rechnet.
Code: Alles auswählen
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
ComCtrls;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
ProgressBar1: TProgressBar;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var
Form1: TForm1;
x, n, s: real;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
begin
Label2.Caption:=floattostr(pi);
progressbar1.step:=10;
progressbar1.min:=0;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
x:=0;
n:=1;
s:=int(strtofloatdef(edit1.text,0));
if s<1 then
begin
s:=1;
showmessage('Ungültige Eingabe');
end;
progressbar1.max:=trunc(s*10);
repeat
n:=n+1;
x:=sqrt(2+x);
label1.Caption:=floattostr(exp(n*ln(2))*sqrt(2-x));
progressbar1.stepit;
until n=s;
x:=exp(s*ln(2))*sqrt(2-x);
label1.caption:=floattostr(x);
showmessage('Fertig');
progressbar1.Position:=0;
end;
end.
Ein weiteres Problem ist, dass ab 27 Durchläufen 0 angezeigt wird.
MfG