2016-05-01 41 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