Исключение с плавающей точкой C ++ Почему и что это? - PullRequest
30 голосов
/ 21 ноября 2010

Я создаю программу для вопросов 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 ]

32 голосов
/ 21 ноября 2010

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

32 голосов
/ 21 ноября 2010
for (i>0; i--;)

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

for (; i>0; i--)

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

10 голосов
/ 21 ноября 2010

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

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

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

2 голосов
/ 14 сентября 2018

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

0 голосов
/ 09 марта 2018

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

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

Это работает так?давайте посмотрим.

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

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

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

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

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

              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.

...