pow for Integral Values

时间:2017-06-15 15:08:49

标签: c++ floating-point integer pow clamp

我需要一个pow版本的整数。我需要使用pow解决2个问题:

  1. 如果结果大于我的整数类型,我需要限制为numeric_limits::max()
  2. 我需要能够处理41.99999四舍五入到42,而不是下降到41
  3. 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;
    }
    

1 个答案:

答案 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;
}

对于更通用的方法,您可能也想考虑下溢。

除了您展示的线性算法之外,还有其他更快的算法(例如参见通过平方的指数计算),但是我不确定是否值得考虑它们除非你处理任意精度算术,或者没有浮点单元的嵌入式系统。

相关问题