gpt4 book ai didi

你能在 C 中使用宏实现阶乘吗?

转载 作者:太空宇宙 更新时间:2023-11-04 06:59:04 25 4
gpt4 key购买 nike

我正在寻找使用宏计算阶乘的示例。我找不到任何有用的东西。有没有一个特定的原因?这是因为 C 的实现吗?

我知道您不能在宏中使用递归,但是有一种方法可以使用迭代阶乘函数。为什么在 C 中不可能有阶乘宏?

这里有一个我发现的阶乘函数迭代实现的例子供引用:

int factorial(int N) {
int product = 1;
for (int j = 1; j <= N; j++)
product *= j;
return product;
}

最佳答案

我想不出在一般情况下使它成为宏的方法,但是定义阶乘函数的 int 值非常少:它为 N 调用未定义的行为> 12 如果 int 有 32 位。

这里有很多方法可以利用这一点:

static int const factorials[13] = { 1, 1, 2, 6, 24, 120, 720, 5040, 40320, 
362880, 3628800, 39916800, 479001600 };
#define FACT(n) ((n) < 0 ? 1 : (n) > 12 ? INT_MAX : factorials[n])

或者:

#define FACT(n) ((n) <= 1 ? 1 : \
(n) == 2 ? 2 : \
(n) == 3 ? 6 : \
(n) == 4 ? 24 : \
(n) == 5 ? 120 : \
(n) == 6 ? 720 : \
(n) == 7 ? 5040 : \
(n) == 8 ? 40320 : \
(n) == 9 ? 362880 : \
(n) == 10 ? 3628800 : \
(n) == 11 ? 39916800 : \
(n) == 12 ? 479001600 : INT_MAX)

请注意,这两者都会对 n 进行多次计算。

内联函数是一种更好的方法。您的 factorial() 可能会编译为现代优化编译器上常量参数的常量:

使用 Matt Godbolt's online compiler 的简短示例使用 clang 3.9 -O2 非常有启发性:

factorial 函数编译成深不可测的 235 行英特尔 SIMD 代码,而 int test(void) { return factorial(12); 只产生 2 条指令:

test():                               # @test()
mov eax, 479001600
ret

即使使用 -Os 优化大小也会产生 49 行汇编代码,这太大了,因为 -O1 在 10 行时要小得多。

关于你能在 C 中使用宏实现阶乘吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40733607/

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