Исключение с плавающей запятой, вызванное rand() в С++

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

Вот функция, которая дает мне исключение с плавающей запятой:

bool modularExponentiationTest(unsigned long long exponent, unsigned long long modulus)
{
    short index = 0;
    unsigned long long base;
    unsigned long long result;

    do
    {
            result = 1;
            base = rand() % exponent; // <--CAUSED BY THIS

            while (exponent > 0) 
            {
                if (exponent & 1)       
                        result = (result * base) % modulus;
                exponent >>= 1;
                base = (base * base) % modulus;
            }

            if (result != 1)
                return false;
    }while(++index < 10);

    return true;
}

Я запустил random в другой функции, выполнив следующие действия:

 srand(time(NULL));

Большое спасибо за Вашу помощь!


person Alex    schedule 22.02.2010    source источник
comment
Какое исключение с плавающей запятой генерируется?   -  person Anon.    schedule 22.02.2010


Ответы (2)


Вы сдвигаете exponent вправо в цикле while, пока оно не достигнет 0.
Итак, когда вы во второй раз достигнете base = rand() % exponent;, exponent будет 0, и у вас будет деление на 0

person f4.    schedule 22.02.2010
comment
Хорошо замечено, exponent понижается до нуля, и нет никакой защиты от того, что он равен нулю. - person Justicle; 22.02.2010
comment
Хороший улов. Сделайте ваши аргументы постоянными. Изменение аргументов передачи по значению внутри функции скрывает такую ​​ошибку. Проверяйте наличие нуля непосредственно перед выполнением модуля в каждом случае. - person thebretness; 22.02.2010
comment
Спасибо большое! Я просто этого не видел. - person Alex; 22.02.2010

Значение exponent равно нулю? Если так, то это исключение деления на ноль прямо здесь.

person Justicle    schedule 22.02.2010
comment
Вероятно, вам следует проверить переменные модуля и экспоненты на ноль, поскольку вы используете модуль с ними обоими. - person thebretness; 22.02.2010
comment
@ Алекс, вы могли бы быть более полезными - какое исключение генерируется и каково значение rand() и exponent? - person Justicle; 22.02.2010