在编译时计算小整数的阶乘
Computing the factorial of a small integer at compile time
我刚刚(再次)实现了一个递归模板,用于在编译时计算整数的阶乘(谁会想到有一天我真的需要它!)。尽管如此,我并没有自己滚动,而是去Boost寻找答案。然而,特殊数学中的阶乘函数特别禁止它与整数类型一起使用,所以我只写了自己的。
不过,Boost中还有其他我应该使用的函数吗?我应该将整数强制转换为double
并使用boost::factorial
函数吗?计算是否在编译时执行?
你不需要Boost,如果你有C++11:,这只是一行
constexpr uint64_t factorial(uint64_t n) {
return n == 0 ? 1 : n * factorial(n-1);
}
即使arg不是编译时常数,它也能工作。uint64_t将与n<21.
如果您在编译时执行此操作并与浮点值相乘,则不会有转换开销(转换也将在编译时进行)。
由于整数中可以容纳的阶乘数量有限,因此您可以手动预计算前20个值,并将其存储在全局或静态数组中。然后使用全局或静态函数在数组中查找阶乘:
#include <iostream>
const int factorials[] =
{
1,
1,
2,
6,
24,
// etc...
};
inline const int factorial(int n) {return factorials[n];}
int main()
{
static const int fourFactorial = factorial(4);
std::cout << "4! = " << fourFactorial << "n";
}
如果使用文字作为factorial
的参数,那么编译器应该简单地用结果替换函数调用(当启用优化时)。我在XCode 4.4(在Mac上)中尝试了上面的例子,在程序集中我看到它用常数24:初始化fourFactorial
.loc 1 20 38 ## /Users/emile/Dev/sandbox/sandbox/main.cpp:20:38
movl $24, __ZZ4mainE13fourFactorial(%rip)
这种方法可能会比使用递归编译时技巧更快地进行编译。
相关文章:
- 在 C++ 中的数组上使用阶乘函数
- 阶乘问题在 c++ 中给出错误的输出
- 大数的阶乘给出错误的输出
- 什么模板用法在阶乘中更好
- 为什么我在C++阶乘函数中出现编译错误?
- 计算阶乘的 C++17 倍表达式中的错误
- 为什么 Lisp 中 1000 阶乘的计算如此之快(并显示正确的结果)?
- 在C++中执行 N 阶乘编译时间的 3 种不同/相同方法
- 平方模型为零,阶乘模型问题
- 阶乘元规划
- 阶乘-c++ 我想以不同的方式打印
- 阶乘函数只返回C++中输入的答案
- 阶乘使用循环递增给出垃圾值
- 大 n 表示阶乘
- 为什么我不能在非常量表达式上使用此模板阶乘函数?
- 计算最大数字的阶乘
- 在编译时计算小整数的阶乘
- 程序以查找数字的阶乘并为负整数输入提供错误消息
- 大整数的乘积(阶乘)
- 快速精确二整数阶乘