Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi bernoulli programm (https://www.delphipraxis.net/46719-bernoulli-programm.html)

LiS 30. Mai 2005 13:43


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:
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;
edit1 = Wahrscheinlichkeit
edit2 = Versuche
edit3 = Erfolge

shmia 30. Mai 2005 13:58

Re: bernoulli programm
 
Zitat:

Zitat von LiS
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)

Beim Berechnen der Fakultät einer Zahl gibt es sehr schnell extrem hohe Werte.
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.

LiS 30. Mai 2005 14:01

Re: bernoulli programm
 
ok... kürzen
werd ich mal versuchen
danke!

BenBE 2. Jun 2005 11:43

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 17:06 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz