我们知道对于various reasons,C ++中没有标准的整数幂函数。我用相当小的整数执行精确算术,计算能力的正确方法是什么?
答案 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)
。如果a
,b
和结果都适合32位整数,则不会出现不准确的行为!
原因是64位双精度完全覆盖了32位整数的范围。
答案 2 :(得分:4)
虽然Kerrek的答案是正确的,但g ++中还有一个“秘密”功能可以有效地完成这项工作。如果你看一下SGI电源功能,它可以很容易地适应你想做的事情:
http://www.sgi.com/tech/stl/power.html
在g ++中,这是以__gnu_cxx::power实现的。你可能不应该在生产代码中使用这些东西......
答案 3 :(得分:1)
除了这里的其他答案之外,维基百科还有一篇很好的文章解释了各种不同的实现 - &gt; LINK