我定义这个宏斐波那契函数不正确计算
#define FIB(n) ((4 << n*(3+n))/((4 << (2*n)) - (2 << n) - 1))%(2 << n)
,当我试图得到答案,如果我叫FIB(7),它给不能正常工作,例如通过我0,那显然是错的。我在python中测试了这个函数,它完美地工作。所以,任何人都可以解释我为什么不在C和C++中工作?
我定义这个宏斐波那契函数不正确计算
#define FIB(n) ((4 << n*(3+n))/((4 << (2*n)) - (2 << n) - 1))%(2 << n)
,当我试图得到答案,如果我叫FIB(7),它给不能正常工作,例如通过我0,那显然是错的。我在python中测试了这个函数,它完美地工作。所以,任何人都可以解释我为什么不在C和C++中工作?
4 << n*(3+n)
变为4 << 7*(3+7)
时,替换n
与7
。它是指4 << 70
。如果int
的大小是32位或64位,移位70位是太多和这个调用未定义的行为在C.
Python支持多精度算术运算,所以它可能工作得很好。
此外,我已经尝试定义为一个无符号long long,同一个故事的函数。但你是对的。 –
'unsigned long long'是64位,70位仍然太多。 –
您可以使用GMP(GNU Multiprecision Library)等多精度库。正如其他人已经告诉你的那样,标准的C++数据类型是有限的。 – orbitcowboy
你的宏甚至没有参数,所以'FIB(7)'甚至没有意义,而且'FIB'本身只有在存在名为'n'的变量的作用域中才有效。 –
@BenjaminLindley修正了这个错误,当我在这里写的时候, –
为什么不使用'constexpr'递归函数呢? – skypjack