web-dev-qa-db-fra.com

Exception à virgule flottante

J'ai respecté ce code avec succès:

#include <stdio.h>
#include <math.h>
int q;

int main()
{
    srand( time(NULL) );
    int n=3;
    q=ceil(sqrt(n));
    printf("%d\n %d\n", n,q);

    if(n == 2)
        printf("%d\n is prime", n);
    else if(n % 2 == 0.0 || n < 2)
        printf("%d\n is not prime", n);
    else
    {
        int x;
        for(x = 0; x < q; x++){
            if(n % x == 0)
            {
                printf("%d\n is not prime", n);
                return;
            }
            else
                printf("%d\n is prime", n);
        }
    }
}

Mais lorsque j'exécute mon code, l'erreur suivante apparaît:

Exception à virgule flottante

Que signifie cette erreur et comment puis-je la réparer?

10
Shelith

Cela est dû à n % x, lorsque x est égal à 0. Vous devriez avoir x à partir de 2. Vous ne devriez pas utiliser de virgule flottante ici, car vous n'avez besoin que d'opérations entières.

Notes générales:

  1. Essayez de mieux formater votre code. Concentrez-vous sur un style cohérent. Par exemple. vous en avez un autre qui commence immédiatement après une accolade if (pas même un espace), et un autre avec une nouvelle ligne entre les deux.
  2. N'utilisez pas de globals sauf si nécessaire. Il n'y a aucune raison pour que q soit global.
  3. Ne retournez pas sans valeur dans une fonction non-void (int).
26
Matthew Flaschen

http://en.wikipedia.org/wiki/Division_by_zero

http://en.wikipedia.org/wiki/Unix_signal#SIGFPE

Cela devrait vous donner une très bonne idée. Puisqu'un module est, dans son sens fondamental, division avec un reste, something % 0 IS division par zéro et en tant que tel, déclenchera l'envoi d'un SIGFPE.

1
realkstrawn93

Cela est dû à n % xx = 0 dans la première itération de la boucle. Vous ne pouvez pas calculer un module par rapport à 0.

0
Andre Holzner