//test.cpp
fmod( pow(2.0,127),467 );// Return result as 132 <-- correct answer
当我使用自己的实现时
int mod( int dividend , int divisor ){
return (dividend % divisor + divisor ) % divisor;
}
int a = mod ( pow(2.0,127),467 );// Wrong result , 441
//or direct use
int a = pow(2.0,127);
int b = a%467 // Will return wrong result , -21
我想得到答案132,fmod可以做到,但为什么我的实现无法得到正确的答案?
最佳答案
正如 Ivan 所解决的,问题在于您超出了整数的范围。不幸的是,没有可以容纳 2^127 的 native 类型(不包括使用两个 64 位结果作为合成的 128 位 int)。
但是,对您来说幸运的是,在这种情况下您更可能想要的是 powmod。 Powmod 是一个 pow 函数,它在计算幂的同时计算 mod(顾名思义)。像这样的事情应该可以帮助你:
int powmod(int b, int e, int m)
{
int result = 1;
while(e > 0){
if(e & 1){
result *= b;
result %= m;
}
b *= b;
b %= m;
e >>= 1;
}
return result;
}
在本例中,b 是底数,e 是指数,m 是模。因此,在本例中,powmod(2, 127, 467)
返回 132——您想要的答案。希望这会有所帮助,如果您正在处理大量大数和模算术,我建议您阅读一两篇关于模运算一致性的文章。
编辑:修复了语法拼写错误。
关于c++ - 使用 fmod 和自己的实现的库 math.h,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23883926/