überladung integer (Normalverteilung Bernoulli)
Christopher
- php
0 Vinzenz Mai0 dedlfix0 Ashura0 Rouven0 Vinzenz Mai0 Daniel Thoma
0 ottogal1 seth
Ein Script für Normalverteilung (Bernoulli-kette) schafft Berechnungen nur sehr eingeschränkt - Es hapert an der Fakultät einer Zahl (ab 171), die PhP nicht mehr schafft. Gibts da nen Tipp?
Hier das Script: http://snucky.sn.funpic.de/scripts/bernoulli/bernoulli.php
Hallo
Ein Script für Normalverteilung (Bernoulli-kette) schafft Berechnungen nur sehr eingeschränkt - Es hapert an der Fakultät einer Zahl (ab 171), die PhP nicht mehr schafft. Gibts da nen Tipp?
eine andere Plattform benutzen oder lieber die mathematischen Funktionen mit beliebiger Genauigkeit verwenden.
Eventuell könntest Du Deinen Berechnungsalgorithmus verbessern, mangels Code kann ich nichts dazu sagen.
Freundliche Grüße
Vinzenz
echo $begrüßung;
Ein Script für Normalverteilung (Bernoulli-kette) schafft Berechnungen nur sehr eingeschränkt - Es hapert an der Fakultät einer Zahl (ab 171), die PhP nicht mehr schafft. Gibts da nen Tipp?
Mal abgesehen, dass PHP schon ab 14! von integer auf float umsteigt, gibt es 2 Bibliotheken, die mit größeren Zahlen präziser umgehen können, als die in PHP eingebauten Typen.
phpinfo() sollte Auskunft geben, ob sie zur Verfügung stehen.
echo "$verabschiedung $name";
Hallo dedlfix.
Mal abgesehen, dass PHP schon ab 14! von integer auf float umsteigt, […]
Wie macht sich dies bemerkbar?
Einen schönen Samstag noch.
Gruß, Ashura
hi,
Mal abgesehen, dass PHP schon ab 14! von integer auf float umsteigt, […]
Wie macht sich dies bemerkbar?
Na darin, dass sich der Typ ändert :-)
(Abgesehen davon, es ist schon bei 13! der Fall.)
$f = 1;
for($i=1; $i<20; $i++) {
$f = $f * $i;
echo $i.' Fakultät ('.$f.') ist vom Typ '.gettype($f)."<br>\n";
}
gruß,
wahsaga
Hallo wahsaga,
Na darin, dass sich der Typ ändert :-)
Und vor allem daran, dass die Genauigkeit abnimmt, da nicht mehr alle Stellen exakt dargestellt werden.
Grüße
Daniel
echo $begrüßung;
(Abgesehen davon, es ist schon bei 13! der Fall.)
Stimmt, meine erste Testscript-Version rechnete fälschlicherweise nur bis $n -1.
echo $i.' Fakultät ('.$f.') ist vom Typ '.gettype($f)."<br>\n";
var_dump($f); wäre einfacher gewesen :-)
echo "$verabschiedung $name";
hi,
echo $i.' Fakultät ('.$f.') ist vom Typ '.gettype($f)."<br>\n";
var_dump($f); wäre einfacher gewesen :-)
Hätte aber an der Stelle mehr Output produziert, als ich mit vorgestellt habe :-)
gruß,
wahsaga
echo $begrüßung;
Mal abgesehen, dass PHP schon ab 14! von integer auf float umsteigt, […]
Wie macht sich dies bemerkbar?
Das Ergebnis ist dann nicht mehr genau sondern gerundet, sprich: es hat nur die bei float übliche eingeschränkte Präzision.
Es gibt unter PHP auch keinen Fakultätsoperator, so dass die Fakultät mit einer eigenen Routine berechnet werden muss. Zum Beispiel so:
for ($f = 1; $n > 0; $n--)
$f *= $n;
Dabei fallen (ab einer bestimmten Größe von $n) gerundete Zwischenergebnisse an, mit denen dann weitergerechnet wird.
Ob diese Ungenauigkeit bei Christophers Aufgabenstellung eine Rolle spielt oder nicht, muss er selbst wissen. Und ob es einen anderen, genaueren Weg der Berechnung gibt, ...
echo "$verabschiedung $name";
Hallo dedlfix.
Mal abgesehen, dass PHP schon ab 14! von integer auf float umsteigt, […]
Wie macht sich dies bemerkbar?Das Ergebnis ist dann nicht mehr genau sondern gerundet, sprich: es hat nur die bei float übliche eingeschränkte Präzision.
Stimmt ja. Die zwingende Expotentialschreibweise war mir entfallen.
(Daher fragte ich mich auch, warum PHP von Integer auf Float wechseln sollte.)
Einen schönen Samstag noch.
Gruß, Ashura
hi,
Stimmt ja. Die zwingende Expotentialschreibweise war mir entfallen.
(Daher fragte ich mich auch, warum PHP von Integer auf Float wechseln sollte.)
Weil der Bereich von Integer für Zahlen dieser Größenordnung nicht mehr ausreicht.
gruß,
wahsaga
Hallo Christopher.
Es hapert an der Fakultät einer Zahl (ab 171), die PhP nicht mehr schafft.
Jetzt würde mich aber interessieren, wie du die Fakultät ermittelst.
Mein Script spuckt bei bspw. 400! das Ergebnis 21333200 aus, was auch stimmen müsste.
Einen schönen Samstag noch.
Gruß, Ashura
Hi,
Mein Script spuckt bei bspw. 400! das Ergebnis 21333200 aus, was auch stimmen
WAS?????
400!, mal sehen, 400*398*397*396 ist schon größer als 21.333.200.
MfG
Rouven
...ach ja, und dass ich da 399 vergessen habe vergessen wir mal...
MfG
Rouven
Hallo Rouven.
Mein Script spuckt bei bspw. 400! das Ergebnis 21333200 aus, was auch stimmen
WAS?????
400!, mal sehen, 400*398*397*396 ist schon größer als 21.333.200.
Ja, stimmt. Ich hatte einen Denkfehler in meinem Script umgesetzt.
Einen schönen Samstag noch.
Gruß, Ashura
Hallo Ashura,
Jetzt würde mich aber interessieren, wie du die Fakultät ermittelst.
Mein Script spuckt bei bspw. 400! das Ergebnis 21333200 aus, was auch stimmen müsste.
Nein, Dein Ergebnis ist falsch.
1! = 1
2! = 2 * 1! = 2
3! = 3 * 2! = 6
4! = 4 * 3! = 24
5! = 5 * 4! = 120
6! = 6 * 5! = 720
7! = 7 * 6! = 5040
8! = 8 * 7! = 40320
9! = 9 * 8! = 362880
10! = 10 * 9! = 3628800
11! = 11 * 10! = 39916880
und das ist bereits größer als
21333200
Dein Wert für 400!
Die Fakultätsfunktion ist streng monoton steigend, 400! ist also weit größer. Wie sieht Dein Skript aus?
Ist Dir jetzt auch klar, warum auf 32-Bit-Architekturen bei 14! üblicherweise bereits Fließkommazahlen verwendet werden?
Freundliche Grüße
Vinzenz
Hallo Ashura,
400! ist genau 64034522846623895262347970319503005850702583026002959458684445942802397169186
83143627847864746326467629435057503585681084829816288351743522896198864680299
79373416541508381624264619423523070462443250151144486708906627739149181173319
55996440709549671345290477020322434911210797593280795101545372667251627877890
00934976376571032635033153396534986838683133935202437378815778679150631185870
26182701698197400629830253085912983461622723045583395207596115053022360868104
33297255194852674432232438669948422404232599805551610635942376961399231917134
06385899653797014782720660632021737947201032135662461380907794230459736069956
75958360961587151299138222865785795493616176544804532220078258184008484364155
91229454275384803558374518022675900061399560145595206127211192918105032491008
00000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000
Den relativen Fehler deines Scripts darfst Du selber ausrechnen ;-)
Grüße
Daniel
Hallo Christopher,
es gibt auch eine Möglichkeit, die Werte der Bernoulli-Verteilung rekursiv zu berechnen. Mit der wohl üblichen und daher hoffentlich verständlichen Abkürzung B(n,p,k) für die Trefferzahl k bei Kettenlänge n und Trefferwahrscheinlichkeit p gilt nämlich der Zusammenhang
B(n,p,k+1) = B(n,p,k) *(n-k)*p/(k+1)/(1-p).
Den Beweis lasse ich hier beiseite ... ;-)
Man darf aber natürlich nicht mit k=0 anfangen und sich dann hocharbeiten - das wird hoffnungslos ungenau, weil die Werte für kleine k klein sind. Man muss also in der Nähe des Maximums einen Startwert explizit berechnen und sich dann der Rekursionsformel nach beiden Seiten bedienen (Man kann sie ja auch nach B(n,p,k) auflösen.
Gruß
Ottogal
gudn tach!
Ein Script für Normalverteilung (Bernoulli-kette)
du meinst binomialverteilung, oder?
erst fuer grosse n naehert sich die binomialverteilung der normalverteilung an.
schafft Berechnungen nur sehr eingeschränkt - Es hapert an der Fakultät einer Zahl (ab 171), die PhP nicht mehr schafft. Gibts da nen Tipp?
wie genau soll denn der spass werden? willst du exakt rechnen? wofuer brauchst du das script?
in vielen faellen genuegt schon die anwendung der stirling-formel.
evtl. wird dein n ja auch gar nicht soo gross, sondern du benutzt bloss die etwas unpraktische standard-formel
[latex]\frac{n!}{(n-k)!\cdot k!}[/latex] ohne einige programmiertechnisch geschickteren veraenderungen.
prost
seth