以下代码行最终在计算后返回错误的结果,这可能是由于" double"的近似引起的。类型?
int base = 20, exp = 27, mod = 123;
std::fmod(std::pow(base, exp), mod)
有没有办法正确计算? (还有base = 128,Exp> = 50 mod> = 200?) 抱歉我的英文不好
答案 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限制之下并在几秒钟内运行。