具有无符号长度的Pow精度

时间:2015-10-22 12:48:08

标签: c precision pow

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

3 个答案:

答案 0 :(得分:5)

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

您还可以查看Exponentiation by squaring并查看barak manos answer,您可以在其中尝试实现自己的战队功能

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;
}

答案 1 :(得分:1)

根据定义,

pow不准确。它使用exp(y*log(x))作为模拟x ^ y的方式。如果您需要完全精确,则需要使用外部库或制作自己的pow版本。

答案 2 :(得分:-1)

我不确定你的代码。但我想你的代码就像这样

double pow(double x, double y) 

这是不对的。因为 pow()总是返回双重类型。

    unsigned long x,y;
    x=...//
    y=...//

    unsigned long res=(unsigned long)pow(x,y);

这就是你输入双重号码的原因。

要获得正确的号码,您可以这样做:

{{1}}