27

我们知道,由于各种原因,C++ 中没有标准的整数幂函数。我正在用相当小的整数执行精确算术,计算幂的正确方法是什么?

4

4 回答 4

45

标准的快速取幂使用重复平方:

uint_t power(uint_t base, uint_t exponent)
{
    uint_t result = 1;

    for (uint_t term = base; exponent != 0; term = term * term)
    {
        if (exponent % 2 != 0) { result *= term; }
        exponent /= 2;
    }

    return result;
}

步数与 的值成对数exponent。该算法可以简单地扩展到模幂运算。


更新:这是算法的修改版本,它执行的乘法减少了一次,并且更有效地处理了一些琐碎的情况。此外,如果您知道指数从不为零,而基数从不为零或一,您甚至可以删除初始检查:

uint_t power_modified(uint_t base, uint_t exponent)
{
    if (exponent == 0) { return 1;    }
    if (base < 2)      { return base; }

    uint_t result = 1;

    for (uint_t term = base; ; term = term * term)
    { 
        if (exponent % 2 != 0) { result *= term; }
        exponent /= 2;
        if (exponent == 0)     { break; }
    }

    return result;
}
于 2012-09-24T09:49:24.857 回答
19

您可以使用std::pow(double a, double b). 如果两者都没有误差ab并且结果适合 32 位整数!

原因是64位双精度完全覆盖了32位整数的范围。

于 2012-09-25T22:24:45.423 回答
4

虽然 Kerrek 的回答是正确的,但 g++ 中还有一个“秘密”功能可以有效地做到这一点。如果你看一下 SGI 幂函数,它可以很容易地适应你想做的事情:

http://www.sgi.com/tech/stl/power.html

在 g++ 中,这被实现为__gnu_cxx::power。不过,您可能不应该在生产代码中使用这些东西......

于 2012-09-26T22:56:37.220 回答
1

除了这里的其他答案之外,维基百科上还有一篇很好的文章,在这里解释了各种不同的实现 -> LINK

于 2012-09-30T03:21:49.517 回答