Исключение с плавающей точкой - PullRequest
11 голосов
/ 01 сентября 2010

Я успешно выполнил этот код:

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

Но когда я запускаю свой код, я получаю следующую ошибку:

Исключение с плавающей точкой

Что означает эта ошибка и как ее исправить?

Ответы [ 3 ]

28 голосов
/ 01 сентября 2010

Это вызвано n % x, когда x равно 0. Вместо этого вы должны начать с x.Вам вообще не следует использовать здесь с плавающей запятой, поскольку вам нужны только целочисленные операции.

Общие замечания:

  1. Попробуйте лучше отформатировать код.Сосредоточьтесь на использовании последовательного стиля.Например, у вас есть еще один, который начинается сразу после фигурной скобки (даже без пробела), а другой - с новой строкой между ними.
  2. Не используйте глобальные переменные без необходимости.Нет никаких оснований для того, чтобы q был глобальным.
  3. Не возвращать без значения в не-void (int) функции.
1 голос
/ 08 апреля 2013

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

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

Это должно дать вам действительно хорошую идею.Поскольку модуль, в его основном смысле, является делением с остатком, something % 0 IS деление на ноль и, как таковое, вызовет выброс SIGFPE.

0 голосов
/ 01 сентября 2010

Это вызвано n % x, где x = 0 в первой итерации цикла. Вы не можете рассчитать модуль относительно 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...