【问题标题】:Floating Point Exception Caused By rand() In c++C++中rand()引起的浮点异常
【发布时间】:2010-02-22 01:20:51
【问题描述】:

我有一个似乎无法解决的问题。我正在随机生成数字以确定我的数字是否是相对素数。

这是给我一个浮点异常的函数:

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;
}

我通过执行以下操作在不同的函数中随机播种:

 srand(time(NULL));

非常感谢您的帮助!

【问题讨论】:

  • 产生了哪个“浮点异常”?

标签: c++ floating-point-exceptions


【解决方案1】:

您在 while 循环中将 exponent 向右移动,直到达到 0。
所以你第二次到达base = rand() % exponent; exponent 是0,你有一个除以0

【讨论】:

  • 很好发现,exponent 正在降档为零,没有人可以防止它为零。
  • 好收获。让你的论点成为常量。在函数内部更改按值传递参数隐藏了这种错误。在每种情况下执行模数之前检查零。
  • 非常感谢!我只是没看到。
【解决方案2】:

exponent 的值是否为零?如果是这样,那就是被零除的异常。

【讨论】:

  • 你应该检查模数和指数变量是否为零,因为你对它们都进行了模数。
  • @Alex 你可能会更有帮助 - 生成的异常是什么,rand()exponent 的值是什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-16
  • 2013-09-13
  • 1970-01-01
  • 2010-09-10
  • 1970-01-01
  • 2018-11-26
  • 1970-01-01
相关资源
最近更新 更多