gpt4 book ai didi

c++ - 在 C++ 编译时是否没有内置方法来计算功率?

转载 作者:IT老高 更新时间:2023-10-28 23:11:06 31 4
gpt4 key购买 nike

我有以下非常简单的模板。据我所知, ^ 不是指数运算符。现在我正在寻找一种计算这种能力的方法。网上有很多递归模板的例子。这不是太难。

但我想知道:C++ 中实际上没有“内置”方法可以在编译时计算它吗?

template <int DIM>
class BinIdx : Idx
{
static const int SIZE = 3 ^ DIM; // whoops, this is NOT an exponential operator!
}

最佳答案

如前所述,您可以使用 <<如果指数是 2 的幂。

否则,如果指数是非负整数,您可以编写一个像这样的 constexpr 函数。

template<typename T, typename U>
auto constexpr pow(T base, U exponent) {
static_assert(std::is_integral<U>(), "exponent must be integral");
return exponent == 0 ? 1 : base * pow(base, exponent - 1);
}

不过,对于大指数和负指数,这显然会失效。

我并不完全了解编译器如何优化常量表达式中的函数调用。这是指数为 2 的幂的情况下的手动优化。这也将减少完成的递归量。

template<typename T>
bool constexpr is_power_of_two(T x) {
return (x != 0) && ((x & (x - 1)) == 0);
}

template<typename T, typename U>
auto constexpr pow(T base, U exponent) {
static_assert(std::is_integral<U>(), "exponent must be integral");
if (is_power_of_two(exponent)) {
return base << exponent;
}
return exponent == 0 ? 1 : base * pow(base, exponent - 1);
}

还提供更高效的算法。但是,我不擅长计算机科学,所以我不知道如何实现它们。

关于c++ - 在 C++ 编译时是否没有内置方法来计算功率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27270541/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com