具有无符号长度的Pow精度

Lif*_*ard 4 c precision pow

所以我想做pow(x,y).其中x和y是无符号长整数,结果存储在无符号长整数中.这个结果将小于2 ^ 63所以我应该能够做到这一点.但由于它返回一个浮点数,我得到大数字的不准确结果.无论如何都可以在不使用像bignum这样的外部库的情况下获得精确的结果?我知道我可以简单地做x*xa Y次,但这是我想避免的,因为我试图让我的程序更快.

Rah*_*thi 5

pow函数返回一个具有精度问题的double,当你将它转换为long时,你肯定会得到精度问题.据我所知,如果你不使用库,那么单独使用pow功能就无法获得准确的结果.

您还可以通过平方来查看指数,还可以查看barak manos的答案,您可以尝试将自己的pow功能实现为

unsigned long long pow(unsigned long long x,unsigned int y)
{
    unsigned long long res = 1;
    while (y > 0)
    {
        if (y & 1)
            res *= x;
        y >>= 1;
        x *= x;
    }
    return res;
}
Run Code Online (Sandbox Code Playgroud)

  • @LifeisHard:`10000 ^ 10000`不小于'2 ^ 63`,所以你会遇到其他问题.除了你需要(大约)125个其他宇宙存储所有这些数字的事实. (2认同)
  • 创建一个函数`unsigned long long pow(unsigned long long x,unsigned int y)...`是一个引起一些讨厌错误的好方法.C没有具有相同名称的函数的签名.掩盖/隐藏符合标准的`双功能(双,双); 功能. (2认同)