c++ - 使用 fmod 和自己的实现的库 math.h

标签 c++ fmod math.h

//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/

相关文章:

c++ - 在函数中使用指向数组的指针

c - 如何标准化 acosf 或 asinf 的输入值?

audio - FMOD channel 设置音量不起作用

php - fmod 返回不正确的结果

c - Rust ffi + wasm (yew -> cargo 网络启动) -> fatal error : 'math.h' file not found

c - Visual Studio 2012 中的 #include <math.h>

c++ - 在什么情况下 "name"必须以 "typename"为前缀?

C++ 将 1 加到非常小的数字?

C++ - 返回 C++11 std::array

c++ - std::fmod 糟糕的 double