在C ++中将整数提升为正整数幂的正确方法是什么?

时间:2012-09-24 09:39:37

标签: c++ math numerical

我们知道对于various reasons,C ++中没有标准的整数幂函数。我用相当小的整数执行精确算术,计算能力的正确方法是什么?

4 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:19)

您可以使用std::pow(double a, double b)。如果ab和结果都适合32位整数,则不会出现不准确的行为!

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

答案 2 :(得分:4)

虽然Kerrek的答案是正确的,但g ++中还有一个“秘密”功能可以有效地完成这项工作。如果你看一下SGI电源功能,它可以很容易地适应你想做的事情:

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

在g ++中,这是以__gnu_cxx::power实现的。你可能不应该在生产代码中使用这些东西......

答案 3 :(得分:1)

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