Floating Point Exception C++ Waarom en wat is het?

Ik ben een programma aan het bouwen voor de Euler-projecten vraag 3, en hoewel dat er misschien niet echt toe doet, probeer ik momenteel deze code een getal te laten nemen en te testen of het priemgetal is of niet. Nu dan, voordat ik de functie ga oplossen, krijg ik de fout “floating point exception” direct na het invoeren van het nummer. Hier is de 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;
}

waarom geeft het me in wezen een uitzondering met drijvende komma en wat betekent dat eigenlijk?


Antwoord 1, autoriteit 100%

Een “drijvende kommagetal” is hoe computers gewoonlijk getallen voorstellen die geen gehele getallen zijn — eigenlijk een getal met een komma. In C++ declareer je ze met floatin plaats van int. Een drijvende-komma-uitzondering is een fout die optreedt wanneer u iets probeert te doen dat onmogelijk is met een drijvende-kommagetal, zoals delen door nul.


Antwoord 2, autoriteit 85%

for (i>0; i--;)

is waarschijnlijk verkeerd en zou moeten zijn

for (; i>0; i--)

in plaats daarvan. Let op waar ik de puntkomma’s plaats. De voorwaarde staat in het midden, niet aan het begin.


Antwoord 3, autoriteit 26%

Veel redenen voor een drijvende-komma-uitzondering. Als je naar je code kijkt, lijkt je for-lus een beetje “onjuist”. Lijkt op een mogelijke deling door nul.

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

Dat is op een gegeven moment delen door nul, omdat je i aan het verlagen bent.


Antwoord 4, autoriteit 11%

Aangezien deze pagina het nummer 1 resultaat is voor de Google-zoekopdracht “c++ floating point exception”, wil ik nog iets toevoegen dat een dergelijk probleem kan veroorzaken: het gebruik van ongedefinieerde variabelen.


Antwoord 5, autoriteit 4%

Het probleem zit in de for-lus in het codefragment:
voor (i > 0; i–;)

Hier lijkt uw bedoeling te zijn in de lus te gaan als (i > 0)en
verlaag de waarde van i met één na voltooiing van for-lus.

Werkt het zo? eens kijken.

Kijk naar de syntaxis van de for()-lus:

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

Initialisatie wordt slechts één keer uitgevoerd aan het begin van de lus.
Let goed op “;” in uw codefragment en wijs het toe met de for loop-syntaxis.

Initialisatie: i > 0 : Wordt slechts één keer uitgevoerd. Heeft geen invloed op uw code.

Conditiecontrole: i –: postverlaging.

             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. 

Laten we hier stoppen en de drijvende-komma-uitzondering bekijken.

wat is het? Een eenvoudig voorbeeld is Delen door 0. Hetzelfde gebeurt met uw code.

Als ik de 1 in conditiecontrole bereik, valideert de conditiecontrole als waar.
Vanwege post-decrement zal ik 0 zijn wanneer het de for-lus binnengaat.

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

Met deze achtergrond zou je het probleem in for loop moeten kunnen oplossen.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

fourteen + twelve =

Other episodes