web-dev-qa-db-fra.com

Flottante Exception C++ Pourquoi et de quoi s'agit-il?

Je construis un programme pour la question 3 des projets Euler, et bien que cela puisse ne pas avoir d'importance, je cherche actuellement à faire en sorte que ce code prenne un numéro et vérifie s'il est premier ou non. Maintenant, avant de pouvoir résoudre la fonction, cela me donne l'erreur "exception de virgule flottante" juste après la saisie du nombre. Voici le 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;
}

donc essentiellement pourquoi cela me donne-t-il une exception de virgule flottante et qu'est-ce que cela signifie même?

28
samuraiseoul

Un " nombre à virgule flottante " est la façon dont les ordinateurs représentent généralement des nombres qui ne sont pas des entiers - en gros, un nombre avec une virgule décimale. En C++, vous les déclarez avec float au lieu de int. Une exception en virgule flottante est une erreur qui se produit lorsque vous essayez de réaliser une tâche impossible avec un nombre à virgule flottante, telle qu'une division par zéro.

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

est probablement faux et devrait être

for (; i>0; i--)

au lieu. Notez où je mets les points-virgules. La condition va au milieu , pas au début.

31
fredoverflow

Beaucoup de raisons pour une exception de virgule flottante. En regardant votre code, votre boucle semble être un peu "incorrecte". Cela ressemble à une division possible par zéro.

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

C'est la division par zéro à un moment donné puisque vous décrémentez i.

9
Pete

Étant donné que cette page est le résultat numéro 1 de la recherche Google "Exception à virgule flottante c ++", je souhaite ajouter une autre chose pouvant entraîner un problème de ce type: utilisation de variables non définies.

2
Algoman

Le problème est dans la boucle pour dans l'extrait de code:
pour (i> 0; i--;)

Ici, votre intention semble être entrer dans la boucle si (i> 0) et Décrémenter la valeur de i de un après la fin de la boucle for .

Est-ce que ça marche comme ça? Voyons voir.

Regardez la syntaxe de la boucle for ():

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

L'initialisation est exécutée une seule fois au début de la boucle. Faites très attention à ";" dans votre extrait de code et mappez-le avec la syntaxe de la boucle for.

Initialisation: i> 0: s'exécute une seule fois. N'a aucun impact sur votre code.

Contrôle de l'état: i -: post décrément.

              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. 

Arrêtons ici et voyons une exception de virgule flottante. 

qu'Est-ce que c'est? Diviser par 0 est un exemple simple. Même chose avec votre code. 

Lorsque i atteint 1 dans la vérification de condition, la vérification de condition valide pour être vraie.
En raison du post décrément, je serai 0 quand il entrera pour la boucle. 

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

Avec ce fond, vous devriez pouvoir résoudre le problème en boucle.

0
Manjunatha S M