我们知道,由于各种原因,C++ 中没有标准的整数幂函数。我正在用相当小的整数执行精确算术,计算幂的正确方法是什么?
问问题
6858 次
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)
. 如果两者都没有误差a
,b
并且结果适合 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 回答