it-roy-ru.com

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

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

28
samuraiseoul

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

30
Crashworks
for (i>0; i--;)

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

for (; i>0; i--)

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

31
fredoverflow

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

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

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

9
Pete

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

2
Algoman

Проблема в цикле 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.

0
Manjunatha S M