ti-enxame.com

Exceção de ponto flutuante

Eu cumpri este código com sucesso:

#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);
        }
    }
}

Mas quando eu executo meu código, recebo o seguinte erro:

Exceção de ponto flutuante

O que esse erro significa e como posso corrigi-lo?

10
Shelith

É causado por n % x, quando x é 0. Você deve ter x start at 2. Você não deve usar ponto flutuante aqui, pois você só precisa de operações inteiras.

Notas gerais:

  1. Tente formatar seu código melhor. Concentre-se em usar um estilo consistente. Por exemplo. você tem uma outra que começa imediatamente após uma chave if (nem mesmo um espaço) e outra com uma nova linha no meio.
  2. Não use globals, a menos que seja necessário. Não há razão para que q seja global.
  3. Não retorne sem um valor em uma função não-vazia (int).
26
Matthew Flaschen

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

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

Isso deve lhe dar uma boa ideia. Como um módulo é, em seu sentido básico, a divisão com um resto, something % 0 IS divisão por zero e como tal, irá disparar um SIGFPE sendo lançado.

1
realkstrawn93

É causado por n % x onde x = 0 na primeira iteração do loop. Você não pode calcular um módulo em relação a 0.

0
Andre Holzner