Binominalkoeffizient



  • hallo leute
    hab letztens ma versucht diese formel hier: http://de.wikipedia.org/wiki/Binomialkoeffizient#Definition

    in c++ zu programmieren. alledings gibt es da noch rpobleme iwie mit der convertierung der datentypen wäre nett wenn ihr mir da etwas helfen könntet

    der gibt mit dauerdn sonen komisches erebnis aus:

    #include <iostream>
    #include <stdlib.h>
    
    using namespace std;
    
    float fak (float x);
    float hoch (float x, float k);
    float bio (float n, float x, float k, float y);      
    
    // START MAIN
    int main()
    {
    float x,y,n,k;
    float b=0;
    
    cout<<"Summe aus: \n";
    cout<<"-> x= ";cin>>x;
    cout<<"-> y= ";cin>>y;
    cout<<"\n->n: ";cin>>n;
    cout<<"->k: ";cin>>k;
    
    // CALC THE BIONOMINAL:
    while(k<=20)
    {
       b+=bio(n,x,k,y);
       k++;
    }
    cout<<"\n\nBinominalkoeffizient lautet: "<<b;
    
      system("PAUSE");
      return 0;
    }
    // END MAIN
    // ============================================================================
    // START FKTN MAIN
    float fak (float x)
    {
           float r=1;
           for(int i=1;i<=x;i++)
                   r*=i;
           return r;
    }
    float hoch (float x, float k)
    {
           float t=1;
           for(int h=0;h<k;h++)
                   t*=x;
           return t;
    }
    float bio (float n, float x, float k, float y)
    {
           float temp;
           temp = fak(n) / (fak(k) * fak((n-k)));
           temp = temp * hoch(x,(n-k)) * hoch(y,k);
           return temp; 
    }
    


  • Machs doch einfach mit int , dann entfällt auch dein Problem. Wieso rechnest du überhaupt mit float ? Beim den Funktionen für Binomialkoeffizient, Potenz und Fakultät geht es immer nur um Ganzzahlen. Passe also die Parameter- und Rückgabetypen (überhaupt die Variablen) entsprechend an.

    Ich würd dir ausserdem zu konsistenter Einrückung raten. Noch was:

    #include <iostream>
    #include <stdlib.h>       // veraltet -> stattdessen <cstdlib>
                              // musst du aber sowieso nicht einbinden, <iostream> reicht
    


  • naja ok...

    aber die werte x und y sind gleitkommazahlen:

    also beispiel ist zB,

    Summe aus:
    -> x= 0.9
    -> y= 0.1

    ->n: 20
    ->k: 18

    Binominalkoeffizient lautet: 1.5571e-016

    da sollte aber eher was mit 0.667 rauskommen

    Im header bereich ist jetzt bei mir :

    #include <iostream>
    #include <iomanip>
    #include <cstdlib>



  • Zephir schrieb:

    -> x= 0.9
    -> y= 0.1

    ->n: 20
    ->k: 18

    Binominalkoeffizient lautet: 1.5571e-016

    da sollte aber eher was mit 0.667 rauskommen

    Mein Taschenrechner sagt mir 1,539 * 10^(-16). Stimmt also.

    BTW: Du willst die Wahrscheinlichkeit bei einem Bernoulliexperiment ausrechnen. Der Binomialkoeffizient ist nur die zweite Zeile deiner bio-Funktion.



  • sooo hab jetz noch nen semenatischen fehler entdeckt...

    Allerdings gibt er mir jetzt 0.676927 aus statt 0.667

    wie kann cih das noch optimieren? 🙂

    der neue code:

    #include <iostream>
    #include <iomanip>
    #include <cstdlib>
    
    using namespace std;
    
    float fak (float x);
    float hoch (float x, int k);
    double bio (int n, float x, int k, float y);      
    
    // START MAIN
    int main()
    {
    float x,y;
    int n,k;
    float b=0;
    
    cout<<"Summe aus: \n";
    cout<<"-> x= ";cin>>x;
    cout<<"-> y= ";cin>>y;
    cout<<"\n->n: ";cin>>n;
    cout<<"->k: ";cin>>k;
    
    // CALC THE BIONOMINAL:
    while(k<=n)
    {
       b+=bio(n,x,k,y);
       k++;
    }
    cout<<"\n\nBinominalkoeffizient lautet: "<<b;
    
      system("PAUSE");
      return 0;
    }
    // END MAIN
    // ============================================================================
    // START FKTN MAIN
    float fak (float x)
    {
           float r=1;
           for(int i=1;i<=x;i++)
                   r*=i;
           return r;
    }
    float hoch (float x, int k)
    {
           float t=1;
           for(int h=0;h<k;h++)
                   t*=x;
           return t;
    }
    double bio (int n, float x, int k, float y)
    {
           float temp;
           temp = fak(n) / (fak(k) * fak((n-k)));
           temp = temp * hoch(x,k) * hoch(y,(n-k));
           return temp; 
    }
    




  • eine wesentlich effektivere Lösung zur Berechnung des Binominialkoeffizienten als

    fak(n) / (fak(k) * fak((n-k)));
    

    ist folgendes:

    int binominalkoeffizient( int n, int k )
    {
        int erg = 1;
        for( int t = 1; n > k; --n, ++t )
            (erg *= n) /= t;
        return erg;
    }
    

    dann kann man auch mit 'int' als Datentyp arbeiten, ohne befürchten zu müssen, mit einem Zwischenergebnis einen overflow zu erzeugen.

    genau wie es auch hier beschrieben ist:

    queer_homo schrieb:

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-209066.html

    Gruß
    Werner


Anmelden zum Antworten