Brauche Hilfe bei C-Programm
-
Hallo,
ich habe ein Projekt in dem ich eine Poissonverteilung grafisch darstellen soll.
Mein Programm an sich funktioniert Problemlos und bei kleinen Erwartungswerten wird die Verteilung auch richtig dargestellt.
Sobald ich aber eine höheren Erwartungswert eingebe, erhalte ich erstmal eine richtige Verteilung aber wenn der Wert wieder 0 werden sollte, habe ich große Ausschläge (siehe Bilder).Meinen Fehler finde ich selbst leider nicht und ich habe auch keine Ahnung an was es liegen könnte.
Die Funktion führe ich unten auf, die Ergebnisse lege ich in eine Struktur ab und um die Funktion zu zeichnen ( oder um die Tabelle zu erstellen) wird die Struktur wieder ausgelesen.Ich hoffe ihr könnt mir irgendwie helfen.
Mfg Frankhier noch ein Link über die Verteilung:
http://www.poissonverteilung.de/poissonverteilung.htmlDiagramm:
http://s14.directupload.net/file/d/3082/ssufdnzl_jpg.htmTabelle:
http://s14.directupload.net/file/d/3082/8uc4vdqi_jpg.htm//Fakultät int fakult(int i) //rekursiver Aufruf der Fakultät { int x; if(i>1) { x=i*fakult(i-1); return x; } else return 1.0; } //Berechnung der Verteilungsfunktion double verteilungsfunktion (double m, int n) { int x; double e1, e2, e3, erg; for(x=0; x<=n ; x++) { e1=fakult(x); //aufrufen der Fakultätsfunktion e2=pow(m,x); //aufrufen der Potenzfunktion (in math.h abgelegt) e3=exp(-m); //aufrufen der Exponentialfunktion (in math.h abgelegt) erg=(e2 / e1) * (e3); tbb[x].x = x; tbb[x].erg = erg; } return erg; }
-
Überleg mal welchem Wertebereich ein int hat.
Meist sind das z.Zt. 32-bit, also geht das von - 231 bis 231-1
Dann überleg mal welche Wert 12!, 13! oder auch 14! haben.
-
- globale Variablen -> Schrott
for(x=0; x<=n ; x++) { ... tbb[x].x = x; tbb[x].erg = erg; }
sieht schon mal sehr fragil aus, bist du sicher, tbb ausreichend dimensioniert zu haben? Für tbb müssen hierbei mind. n**+1** Elemente definiert sein.
-
frank_90 schrieb:
Sobald ich aber eine höheren Erwartungswert eingebe, erhalte ich erstmal eine richtige Verteilung aber wenn der Wert wieder 0 werden sollte, habe ich große Ausschläge (siehe Bilder).
Das liegt wahrscheinlich daran, dass die Fakultät in Integer berechnet und zurückgegeben wird. Das gibt einen Überlauf. Versuchs mal mit Double:
//Fakultät double fakult(double i) //rekursiver Aufruf der Fakultät { double x; if(i>1) { x=i*fakult(i-1); return x; } else return 1.0; }
Und der Aufruf:
e1=fakult((double)x);
Das war jetzt erst mal ein Quickhack ... das geht auch schöner
viele grüße
ralph
-
Genau lag am Integer. Oh mann da hätte ich auch selbst drauf kommen können. Danke