我知道 2 的幂可以使用 << 运算符来实现。 10的幂呢?像 10^5?有没有比 C++ 中的 pow(10,5) 更快的方法?这是一个非常简单的手动计算。但是由于数字的二进制表示,计算机似乎并不容易……让我们假设我只对整数幂 10^n 感兴趣,其中 n 是整数。
原文由 szli 发布,翻译遵循 CC BY-SA 4.0 许可协议
我知道 2 的幂可以使用 << 运算符来实现。 10的幂呢?像 10^5?有没有比 C++ 中的 pow(10,5) 更快的方法?这是一个非常简单的手动计算。但是由于数字的二进制表示,计算机似乎并不容易……让我们假设我只对整数幂 10^n 感兴趣,其中 n 是整数。
原文由 szli 发布,翻译遵循 CC BY-SA 4.0 许可协议
基于 constexpr 函数的通用表生成器。浮点部分需要 c++20 和 gcc,但非浮点部分适用于 c++17。如果将“auto”类型参数更改为“long”,则可以使用 c++14。未正确测试。
#include <cstdio>
#include <cassert>
#include <cmath>
// Precomputes x^N
// Inspired by https://stackoverflow.com/a/34465458
template<auto x, unsigned char N, typename AccumulatorType>
struct PowTable {
constexpr PowTable() : mTable() {
AccumulatorType p{ 1 };
for (unsigned char i = 0; i < N; ++i) {
p *= x;
mTable[i] = p;
}
}
AccumulatorType operator[](unsigned char n) const {
assert(n < N);
return mTable[n];
}
AccumulatorType mTable[N];
};
long pow10(unsigned char n) {
static constexpr PowTable<10l, 10, long> powTable;
return powTable[n-1];
}
double powe(unsigned char n) {
static constexpr PowTable<2.71828182845904523536, 10, double> powTable;
return powTable[n-1];
}
int main() {
printf("10^3=%ld\n", pow10(3));
printf("e^2=%f", powe(2));
assert(pow10(3) == 1000);
assert(powe(2) - 7.389056 < 0.001);
}
原文由 Alexander Torstling 发布,翻译遵循 CC BY-SA 4.0 许可协议
3 回答877 阅读✓ 已解决
1 回答2.3k 阅读
1 回答840 阅读✓ 已解决
2 回答1.2k 阅读
1 回答1.2k 阅读
1 回答724 阅读
1 回答789 阅读
像这样的东西:
显然,可以为
long long
做同样的事情。这应该比任何竞争方法快几倍。然而,如果你有很多基数,它是非常有限的(尽管随着基数的增加值的数量会急剧下降),所以如果没有大量的组合,它仍然是可行的。
作为对比:
使用 g++ 4.6.3 编译,使用
-Wall -O2 -std=c++0x
,得到以下结果:(我也有使用
pow
的选项,但我第一次尝试时花了 1m22.56s,所以当我决定优化循环变体时我删除了它)