Исключение с плавающей точкой C++ Почему и что это?

Я создаю программу для 3-го проекта проектов Эйлера, и, хотя в результате это может и не иметь значения, я сейчас пытаюсь заставить этот код взять число и проверить, является ли он простым или нет. Теперь, прежде чем я устраню неполадки в функции, она выдаст мне ошибку "Исключение с плавающей запятой" сразу после ввода числа. Вот код:

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

по сути, почему это дает мне исключение с плавающей запятой и что это вообще значит?

5 ответов

Решение

" Число с плавающей запятой" - это то, как компьютеры обычно представляют числа, которые не являются целыми числами - в основном, число с десятичной точкой. В C++ вы объявляете их float вместо int, Исключением с плавающей запятой является ошибка, которая возникает, когда вы пытаетесь сделать что-то невозможное с числом с плавающей запятой, например деление на ноль.

for (i>0; i--;)

вероятно неправильно и должно быть

for (; i>0; i--)

вместо. Обратите внимание, где я поставил точку с запятой. Состояние идет в середине, а не в начале.

Множество причин для исключения с плавающей запятой. Глядя на ваш код, ваш цикл for кажется немного "неправильным". Похоже на возможное деление на ноль.

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

Это деление на ноль в какой-то момент, так как вы уменьшаете i.

Так как эта страница является результатом № 1 для поиска в Google "C++ с плавающей запятой", я хочу добавить еще одну вещь, которая может вызвать такую ​​проблему: использование неопределенных переменных.

Проблема в цикле for во фрагменте кода:
для (i > 0; i--;)

Здесь, похоже, ваше намерение войти в цикл, если (i > 0), и уменьшить значение i на единицу после завершения цикла for.

Это работает так? Посмотрим.

Посмотрите на синтаксис цикла for():

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

Инициализация выполняется только один раз в начале цикла. Обратите особое внимание на ";" в вашем фрагменте кода и сопоставьте его с синтаксисом цикла for.

Инициализация: i > 0: выполняется только один раз. Не влияет на ваш код.

Проверка состояния: я -: после декремента.

              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. 

Остановимся здесь и увидим исключение с плавающей точкой.

что это? Один простой пример - деление на 0. То же самое происходит с вашим кодом.

Когда я достигаю 1 в проверке состояния, проверка состояния подтверждается как истинная.
Из-за пост декремента я буду 0, когда он входит в цикл.

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

С этим фоном вы сможете исправить проблему в цикле for.

Другие вопросы по тегам