it-swarm.com.de

Gleitkomma-Ausnahme C++ Warum und was ist das?

Ich baue ein Programm für die Euler-Projekte, Frage 3, und obwohl dies als Ergebnis nicht wirklich wichtig ist, versuche ich, diesen Code dazu zu bringen, dass er eine Zahl erhält und testet, ob er Primzahl ist oder nicht. Nun, bevor ich die Funktion überprüfen kann, gibt es den Fehler "Gleitkommaausnahme" direkt nach der Eingabe der Nummer. Hier ist der Code:

int main()
{
    int input;
    cout << "Enter number: " << endl;
    cin>> input;
    int i = input/2;
    int c;
    for (i>0; i--;) {
        c= input%i;
        if (c==0 || i == 1)
            cout << "not prime" << endl;
        else
            cout << "prime" << endl;
    }
    return 0;
}

warum gibt es mir im Wesentlichen eine Gleitkomma-Ausnahme und was bedeutet das überhaupt?

28
samuraiseoul

Ein " Gleitkommazahl " ist, wie Computer normalerweise Zahlen darstellen, die keine ganzen Zahlen sind - im Grunde eine Zahl mit Dezimalpunkt. In C++ deklarieren Sie sie mit float anstelle von int. Eine Gleitkommaausnahme ist ein Fehler, der auftritt, wenn Sie versuchen, mit einer Gleitkommazahl etwas Unmögliches zu tun, z.

30
Crashworks
for (i>0; i--;)

ist wahrscheinlich falsch und sollte sein

for (; i>0; i--)

stattdessen. Beachten Sie, wo ich die Semikolons platziere. Die Bedingung geht in der Mitte nicht am Start.

31
fredoverflow

Es gibt viele Gründe für eine Gleitkomma-Ausnahme. Wenn Sie Ihren Code betrachten, scheint Ihre for-Schleife etwas "falsch" zu sein. Sieht aus wie eine mögliche Division durch Null.

for (i>0; i--;){
c= input%i;

Das ist Teilung durch Null an einem Punkt, seit Sie i dekrementieren.

9
Pete

Da diese Seite die Nummer 1 für die Google-Suche "C++ - Gleitkommaausnahme" ist, möchte ich noch etwas hinzufügen, das ein solches Problem verursachen kann: Verwendung von undefinierten Variablen.

2
Algoman

Problem ist die for-Schleife im Code-Snippet:
für (i> 0; i -;)

Hier scheint es Ihre Absicht zu sein, in die Schleife zu gelangen, wenn (i> 0) und Den Wert von i um eins nach Abschluss von for-Schleife verringern.

Funktioniert das so? Mal schauen.

Schauen Sie sich die for () - Loop-Syntax an:

**for ( initialization; condition check; increment/decrement ) {  
    statements;  
}**

Die Initialisierung wird nur einmal am Anfang der Schleife ausgeführt. Achten Sie besonders auf ";" in Ihrem Code-Snippet und ordnen Sie es mit for-Loop-Syntax zu.

Initialisierung: i> 0: Wird nur einmal ausgeführt. Hat keinen Einfluss auf Ihren Code.

Zustandsüberprüfung: i -: Nach Dekrement.

              Here, i is used for condition check and then it is decremented. 
              Decremented value will be used in statements within for loop. 
              This condition check is working as increment/decrement too in your code. 

Lasst uns hier aufhören und eine Gleitkomma-Ausnahme sehen. 

was ist es? Ein einfaches Beispiel ist Divide by 0. Gleiches passiert mit Ihrem Code. 

Wenn i bei der Zustandsüberprüfung 1 erreicht, wird die Zustandsüberprüfung als wahr bestätigt.
Aufgrund von Post-Dekrement wird ich 0 sein, wenn sie in die Schleife eintritt. 

Modulo operation at line #9 results in divide by zero operation.  

Mit diesem Hintergrund sollten Sie das Problem in der for-Schleife beheben können.

0
Manjunatha S M