2016-05-01 73 views
6

我定义这个宏斐波那契函数不正确计算

#define FIB(n) ((4 << n*(3+n))/((4 << (2*n)) - (2 << n) - 1))%(2 << n) 

,当我试图得到答案,如果我叫FIB(7),它给不能正常工作,例如通过我0,那显然是错的。我在python中测试了这个函数,它完美地工作。所以,任何人都可以解释我为什么不在C和C++中工作?

+1

你的宏甚至没有参数,所以'FIB(7)'甚至没有意义,而且'FIB'本身只有在存在名为'n'的变量的作用域中才有效。 –

+0

@BenjaminLindley修正了这个错误,当我在这里写的时候, –

+3

为什么不使用'constexpr'递归函数呢? – skypjack

回答

10

4 << n*(3+n)变为4 << 7*(3+7)时,替换n7。它是指4 << 70。如果int的大小是32位或64位,移位70位是太多和这个调用未定义的行为在C.

Python支持多精度算术运算,所以它可能工作得很好。

+0

此外,我已经尝试定义为一个无符号long long,同一个故事的函数。但你是对的。 –

+0

'unsigned long long'是64位,70位仍然太多。 –

+0

您可以使用GMP(GNU Multiprecision Library)等多精度库。正如其他人已经告诉你的那样,标准的C++数据类型是有限的。 – orbitcowboy