为什么我用std :: pow和std :: fmod会得到错误的结果?

时间:2018-01-31 20:19:48

标签: c++

以下代码行最终在计算后返回错误的结果,这可能是由于" double"的近似引起的。类型?

    int base = 20, exp = 27, mod = 123;
    std::fmod(std::pow(base, exp), mod)

有没有办法正确计算? (还有base = 128,Exp> = 50 mod> = 200?) 抱歉我的英文不好

1 个答案:

答案 0 :(得分:0)

您的问题是浮点错误。传递到pow()时,数字会转换为双精度数,而双精度数可以存储54个有效二进制数字,这不足以准确存储20 ^ 27。最好通过重复result = result * base % mod exp时间来利用模运算,如下所示:

int result = 1;
for(int i = 0; i < exp; i++)
{
    result = result * base % mod;
}

只要输入不是太大,这应该将值保持在int限制之下并在几秒钟内运行。