Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Problem mit montecarlo mit festen werten


Ivo@CoMRoK - Di 07.02.06 18:52
Titel: Problem mit montecarlo mit festen werten
Hi!
Ich hab mal was geproggt mit monte-carlo, zum Pi ausrechnen.
Nun hab ich mir gedacht ich mach des mal ohne Zufallszahlen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ComCtrls;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Edit1: TEdit;
    Button1: TButton;
    Label2: TLabel;
    Edit2: TEdit;
    ProgressBar1: TProgressBar;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  z: Extended;
  k,n,t: LongInt;
  Text: String;
  x,y: Real;
  a: Single;

implementation

{$R *.DFM}


procedure TForm1.Button1Click(Sender: TObject);
begin
  t := 0;
  n := 0;
  x := 0.01;
  y := 0.01;
  repeat
    repeat
      if x*x + y*y <= 1 then inc(t);
      x := x + 0.01;
    until x = 1;
    y := y + 0.01;
    x := 0;
    inc(n);
  until y = 1;
  z := 4*t/n;
  Edit2.Text := 'Pi = ' + FloatToStrF(z,ffFixed,18,18);
end;

end.


Aber das hängt sich auf. Ich hab schon geguckt, find den Fehler aber nicht.
Könnt ihr mir helfen?
DhÄnX


Fabian W. - Di 07.02.06 18:56

ich würde mal prüfen ob du da keine endlosschleife produzierst, vlt wird x oder y nie 1, oder braucht halt a**** lange ;-)


Ivo@CoMRoK - Di 07.02.06 18:59

Ja des 0.01 = 0,100000000000023!!!
Hatte ich schomma , hatte StrToInt(0,1) und habs ez mit 0.01 gemacht wie krieg ichn des hin das des GENAU 0,01 ist :?:


Gausi - Di 07.02.06 19:35

Gar nicht. Floats sollten nie mit = verglichen werden. Nimm als Abbruchbedingungen in den Schleifen besser {bzw. y} >= 1;


Ivo@CoMRoK - Di 07.02.06 20:15

ja ich war grad bei E-Gitarre komm ins Zimmer und denk ich Idiot!!! Machs doch einfach mit >=!!!
Aber das dauert trotdem total lange :?: Keine Ahnung ich werd nochma zeile für zeile überprüfen!
DäNx


Ivo@CoMRoK - Di 07.02.06 20:30

okay ich hatte den jetzt 10 min laufen und nix is passiert (3Ghz).


Gausi - Di 07.02.06 20:42

hmmm. Hiermit

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
procedure TForm1.Button1Click(Sender: TObject);
begin
  t := 0;
  n := 0;
  x := 0.01;
  y := 0.01;
  repeat
    repeat
      if x*x + y*y <= 1 then inc(t);   
      x := x + 0.0001;
    until x >= 1;
    y := y + 0.0001;
    x := 0;
    inc(n);
  until y >= 1;
  z := 4*t/n;
  Edit2.Text := 'Pi = ' + FloatToStrF(z,ffFixed,18,18);
end;
bekomme ich in ca. 5 Sekunden (man beachte das Inkrement!):
Project1 hat folgendes geschrieben:
Pi = 31330,032521967478000000

Hast du beide > durch >= ersetzt?


Ivo@CoMRoK - Di 07.02.06 20:46

Omfg! Gott bin ich blöd :shock: !
ICh habs nur bei dem einen Gemacht! :oops:
Danke für den Hinweis


Ivo@CoMRoK - Mi 08.02.06 12:14

Geht doch net!


Gausi - Mi 08.02.06 12:16

Was geht nicht?


Ivo@CoMRoK - Fr 10.02.06 13:33

also es geht schon nur krieg ich da 33,333333333333337600 als Wert und soweit ich weiß is des net Pi.