我需要一个pow
版本的整数。我需要使用pow
解决2个问题:
numeric_limits::max()
C ++在这里为我提供了某种内联解决方案,还是我不得不编写自己的函数:
template <typename T>
enable_if_t<is_integral_v<T>, T> mypow(const T base, unsigned int exp) {
T result = exp == 0U ? base : 1;
while(exp-- > 1U) {
if(numeric_limits<T>::max() / result <= base) return numeric_limits<T>::max();
result *= base;
}
return result;
}
答案 0 :(得分:3)
C ++是否为我提供了某种内联解决方案
不,标准库中没有整数pow
。
是不是我写了自己的功能
是的,你可以编写自己的功能。请注意,您显示的乘法循环可能比使用std::pow
来实现该函数要慢,特别是因为您在循环中也有分支和分区:
template<class I>
I int_pow_no_overflow(I base, I exp)
{
double max = std::numeric_limits<I>::max();
double result = std::round(std::pow(base, exp));
return result >= max
? max
: result;
}
对于更通用的方法,您可能也想考虑下溢。
除了您展示的线性算法之外,还有其他更快的算法(例如参见通过平方的指数计算),但是我不确定是否值得考虑它们除非你处理任意精度算术,或者没有浮点单元的嵌入式系统。