[C++]Nur manchmal Floating Point Exception

Romsl

Erfahrenes Mitglied
Hi,

ich habe folgende Funktion zur Berechnung von Wahrscheinlichkeiten. Es werden 2 Parameter l und r eingegeben. Ausgegeben werden soll n.

q(n, l) < r.

Ich denke, dass die Berechnungen korrekt sind. Für kleine Werte funktioniert das ganze auch. Bsp l = 4 und r = 0.25 aber gehe ich höher dann bekomme ich eine Floating Point Exception. Kann mir vielleicht jemand verraten wodurch diese Exception erfolgt oder noch besser einen Vorschlag zur Lösung meines Problems bereitstellen?

Code:
#include <iostream>
#include <cmath>

using namespace std;

/*
 * Description: This program calculate n of q(n, l) < r. Needed input
 * parameters are l and r.
 */
class BinomialCalc
{
    public:
        
        //calculated n
        int n;
        int n_loop;
        int fac_help;
        
        double r_calc;
        double r_save;
        
        /*
         * standard constructor
         */
        BinomialCalc()
        {
            //empty constructor
        } 

        void binomialCalc(double l, double r)
        {
            n = 0;
            n_loop = 0;
            r_calc = 0;
            
            /*
             * Loop iteration of the output result n.
             */
            while(r > r_calc)
            {
                fac_help = 0;

                n_loop = n + 1;
                
                /*
                 * calculates the sum of probabilities of an event
                 */
                r_calc = pow((1 / l), n_loop);
                
                for (int i = n_loop; i > 1; i--)
                {
                    cout << "i: " << i << endl;
                    
                    fac_help++;
                    
                    r_calc += ((faculty(i) / (faculty(i - fac_help) * faculty(fac_help))) * 
                               pow((1 / l), (i - fac_help)) * ((l - fac_help) / l));
                                      
                }
                
                //iteration of n
                n++;      
            }
            cout << "q(" << n << ", " << l << ") < " << r << endl;
            cout << "Somit ist n = " << n << endl;
        }
        
        /*
         * calculates the faculty of an integer n.
         */
        int faculty(int n) 
        {
            int result = 1;
                
            do
            {
                 result = result * n;
                 n = n - 1;
            }
            while (n > 0);
            
            return result;
        }
};    

int main(int argc, char *argv[])
{
    if (argc == 3)
    {
        //convert chars to double values
        double l_in = atof(argv[1]);
        double r_in = atof(argv[2]);
        
        BinomialCalc *calculation = new BinomialCalc();
  
        calculation->binomialCalc(l_in, r_in);
        
        delete calculation;
    }
    else
    {
        cout << "Falsche Anzahl von Argumenten" << endl;
    }    
    
  return 0;
}

Danke und Gruß

Romsl
 
Hi,
dein Problem liegt darin das du deine Fakultätsfunktion falsch definiert hast..
fak(0) = 1 ! (und nicht fak(0) = 0)

Somit dividierst du bei entsprechenden Zahlen einmal durch 0 und die Gleitkommaausnahme
ist perfekt;)

Mach aus der Fuß eine Kopfgesteurte Schleife in deiner Fakultätsfunktion und du solltest
damit keine Probleme mehr haben...

Code:
        int faculty(int n)   
        {
            int result = 1;      
                
            while (n > 0)        
            {
                 result = result * n; 
                 n = n - 1;           
            }
            
            return result;       
        }

Somit ist jetzt fak(0) = 1 wie es die Mathematik vorschreibt...

Gruß

RedWing
 
Zurück