![]() |
bernoulli programm
hi
ich hab mir mal auf die schnelle ein bernoulli programm geschrieben, allerdings gibt es bei geringen zahlen schon falsche ergebnisse. (bis 20 versuche funktioniert es noch) hier der quelltext
Delphi-Quellcode:
edit1 = Wahrscheinlichkeit
function fak(k:integer):integer;
var i:integer; begin result := 1; for i := 2 to k do result := result * i; end; procedure TForm1.Button1Click(Sender: TObject); var p:extended; function ncr(n,k:integer):integer; var i:integer; begin result := n-k+1; for i := 2 to k do result := result*(n-k+i); result := round(result / fak(k)); end; begin p:=0; p:=power(strtofloat(edit1.Text),strtoint(edit3.Text)); p:=p*power(1-strtofloat(edit1.Text),(strtoint(edit2.Text)-strtoint(edit3.Text))); p:=p*ncr(strtoint(edit2.Text),strtoint(edit3.Text)); p:=100*p; label4.Caption := floattostr(p); end; edit2 = Versuche edit3 = Erfolge |
Re: bernoulli programm
Zitat:
Mit einem normalen Integer (MaxInt=2147483647)bist du da ganz schnell am Ende. 13! müsste einen 32bit Integer schon sprengen. Der Trick an der Sache ist nun das geschickte Kürzen der Terme. Beim Berechnen von N über K (bei dir in funcion ncr) muss alles versucht werden, damit Werte, die sich sowieso wegkürzen, gar nicht erst berechnet werden. |
Re: bernoulli programm
ok... kürzen
werd ich mal versuchen danke! |
Re: bernoulli programm
Schau Dir mal in cvs.sourceforge.net/viewcvs.py/omorphia/omorphia/library/source/OMathGeneral.pas (Omorphia Projekt) die Funktion BinomialRow an.
Mit dieser kannst Du die NCR-Dinge auch sehr einfach Berechnen, ohne einen Overflow zu erhalten. Die Extended-Implementierung hält bis Zeile 16391 mit, sollte also für deine Zwecke vollkommen ausreichen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:30 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz