Christopher: überladung integer (Normalverteilung Bernoulli)

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

  1. 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

  2. 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";

    1. 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

      --
      sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
      „It is required that HTML be a common language between all platforms. This implies no device-specific markup, or anything which requires control over fonts or colors, for example. This is in keeping with the SGML ideal.“
      [HTML Design Constraints: Logical Markup]
      1. 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

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }
        1. 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

        2. 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";

          1. 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

            --
            /voodoo.css:
            #GeorgeWBush { position:absolute; bottom:-6ft; }
      2. 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";

        1. 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

          --
          sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
          „It is required that HTML be a common language between all platforms. This implies no device-specific markup, or anything which requires control over fonts or colors, for example. This is in keeping with the SGML ideal.“
          [HTML Design Constraints: Logical Markup]
          1. 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

            --
            /voodoo.css:
            #GeorgeWBush { position:absolute; bottom:-6ft; }
  3. 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

    --
    sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
    „It is required that HTML be a common language between all platforms. This implies no device-specific markup, or anything which requires control over fonts or colors, for example. This is in keeping with the SGML ideal.“
    [HTML Design Constraints: Logical Markup]
    1. 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

      --
      -------------------
      ie:| fl:| br:> va:| ls:& fo:) rl:( n4:{ ss:) de:] js:| ch:? mo:} zu:|
      1. ...ach ja, und dass ich da 399 vergessen habe vergessen wir mal...

        MfG
        Rouven

        --
        -------------------
        ie:| fl:| br:> va:| ls:& fo:) rl:( n4:{ ss:) de:] js:| ch:? mo:} zu:|
      2. 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

        --
        sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
        „It is required that HTML be a common language between all platforms. This implies no device-specific markup, or anything which requires control over fonts or colors, for example. This is in keeping with the SGML ideal.“
        [HTML Design Constraints: Logical Markup]
    2. 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

    3. 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

  4. 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

  5. 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