在这里打死马。在 C 中进行整数幂的一种典型(和快速)方法是这个经典的:
int64_t ipow(int64_t base, int exp){
int64_t result = 1;
while(exp){
if(exp & 1)
result *= base;
exp >>= 1;
base *= base;
}
return result;
}
但是我需要一个编译时整数幂,所以我继续使用 constexpr 进行了递归实现:
constexpr int64_t ipow_(int base, int exp){
return exp > 1 ? ipow_(base, (exp>>1) + (exp&1)) * ipow_(base, exp>>1) : base;
}
constexpr int64_t ipow(int base, int exp){
return exp < 1 ? 1 : ipow_(base, exp);
}
第二个功能只是以可预测的方式处理小于 1 的指数。在这种情况下,通过exp<0
是一个错误。
递归版本慢 4 倍
我在 [0,15] 范围内生成 10E6 个随机值基数和指数的向量,并在向量上对两种算法进行计时(在进行非定时运行以尝试消除任何缓存效果之后)。如果不进行优化,递归方法的速度是循环的两倍。但是使用 -O3 (GCC),循环比递归方法快 4 倍。
我对你们的问题是:任何人都可以想出一个更快的 ipow() 函数来处理 0 的指数和底数并且可以用作constexpr
?
(免责声明:我不需要更快的 ipow,我只是想看看这里的聪明人能想出什么)。