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 public 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 x >= 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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!