Почему я получаю ошибку Исключение с плавающей запятой?

Я пытаюсь написать код, который находит идеальные числа ниже, чем ввод пользователя. Пример правильного вывода:

Введите положительное целое число: 100
6 – совершенное число
28 – совершенное число
Больше нет совершенных чисел, меньших или равных 100.

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

и не могу понять почему. Что я делаю не так?

Вот мой код:

#include <iostream>

using namespace std;

bool isAFactor(int, int);

int main(){
    int x, y;
    int countOut, countIn;
    int userIn;
    int perfect = 0;

    cout << "Enter a positive integer: ";
    cin >> userIn;

    for(countOut = 0; countOut < userIn; countOut++){
        for(countIn = 1; countIn <= countOut; countIn++){
            if(isAFactor(countOut, countIn) == true){
                countOut = countOut + perfect;
            }
        }

        if(perfect == countOut){
            cout << perfect << " is a perfect number" << endl;
        }

        perfect++;
    }

    cout << "There are no more perfect numbers less than or equal to " << userIn << endl;

    return 0;
}


bool isAFactor(int inner, int outer){
    if(outer % inner == 0){
        return true;
    }

    else{
        return false;
    }
}

person user2304913    schedule 21.04.2013    source источник
comment
Вы вычисляете x % 0.   -  person Aki Suihkonen    schedule 21.04.2013
comment
Было бы полезно, если бы вы разместили реальное сообщение об ошибке. Я совершенно уверен, что ни один компилятор никогда не говорит о принятии. Также немного странно, что у вас есть ошибки с плавающей запятой в коде, который является только целым числом.   -  person David Heffernan    schedule 21.04.2013
comment
Исключение с плавающей запятой Вычисление идет x % 1. Не так ли? Странно, что я получаю это сообщение об ошибке только со значениями int и bool. Вот почему я задаю вопрос :P   -  person user2304913    schedule 21.04.2013
comment
1) Да, бывает. Проверьте свою функцию isAFactor. 2) Не имеет значения. Сигнал SIGFPE отправляется процессу, когда он выполняет ошибочную арифметическую операцию, например деление на ноль.   -  person awesoon    schedule 21.04.2013


Ответы (2)


Чтобы пояснить комментарий @Aki Suihkonen, при выполнении: outer % inner Если inner равно нулю, вы получите ошибку разделить на ноль.

Это можно проследить, вызвав isAFactor(0, 1).
Он находится в вашем цикле for в main.

Первый параметр isAFactor(countOut, countIn) назначается в самом внешнем цикле for: for (countOut = 0; ...

Обратите внимание на значение, которым вы инициализируете countOut.

Редактировать 1:

Change your `isAFactor` function to:  

    if (inner == 0)
    {
       cerr << "Divide by zero.\n";
       cerr.flush();
       return 0;
    }
    if (outer % inner ...

Поместите точку останова на любую cerr строку выше.
Когда выполнение на этом остановится, посмотрите на трассировку стека. Хороший отладчик также позволит вам проверить параметры/значения в каждой точке трассировки.

person Thomas Matthews    schedule 21.04.2013
comment
Я изменил «bool isAFactor (int inner, int external)» на «isAFactor (int external, int inner)», чтобы он больше не делился на ноль. Но то же самое сообщение об ошибке отображается. - person user2304913; 21.04.2013
comment
См. мою Редактировать 1:. Используйте отладчик. - person Thomas Matthews; 21.04.2013
comment
Спасибо, теперь я вижу, в чем проблема. но я до сих пор не понимаю, почему он делится на ноль. Я даже пробовал 'if(inner == 0){inner++;}' - person user2304913; 21.04.2013

Аргументы просто меняются местами. Вы вызываете функцию как isAFactor(countOut, countIn), когда вы должны вызывать с isAFactor(countIn, countOut)

person UmNyobe    schedule 21.04.2013
comment
Я пробовал это, все равно выдает ту же ошибку... спасибо за предложение, хотя - person user2304913; 21.04.2013
comment
Я изменил свой isAFactor на isAFactor (int external, int inner), но он все еще не работает .... все та же ошибка - person user2304913; 21.04.2013