Исключение с плавающей точкой 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.