2016-05-01 19 views
6

Mam zdefiniowane To makrofunkcja Fibonacciego nie oblicza poprawnie

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

i gdy próbuję uzyskać odpowiedź, nie działa prawidłowo, przez przykład jeśli zadzwonię FIB (7), daje ja 0, to wyraźnie jest złe. Testowałem tę funkcję w Pythonie i działa idealnie. Więc każdy może mi wyjaśnić, dlaczego nie działa w C i C++?

+1

Twoje makro nie bierze nawet argumentów, więc 'FIB (7)' nie ma nawet sensu, a 'FIB' sam działa tylko wtedy, gdy jest używany w zasięgu, w którym istnieje zmienna o nazwie' n'. –

+0

Naprawiono @BenjaminLindley, to było błędne pisanie, kiedy to napisałem tutaj, –

+3

Dlaczego zamiast tego nie użyjesz funkcji rekurencyjnej 'constexpr'? – skypjack

Odpowiedz

10

4 << n*(3+n) staje się 4 << 7*(3+7) po zamianie n na 7.

Oznacza to 4 << 70. Jeśli rozmiar int wynosi 32 bitów lub 64 bitów, 70 bitów przesunięcia jest zbyt wiele, a to wywołuje niezdefiniowanej zachowanie w C.

Python obsługuje wiele precyzji arytmetyki, więc może dobrze działać.

+0

Próbowałem również zdefiniowane jako funkcja z niepodpisaną długą długą historią. Ale masz rację. –

+0

'unsigned long long' is 64 bit, 70 bitów nadal będzie za dużo. –

+0

Można użyć do tego celu wieloprecyzyjnej biblioteki, takiej jak GMP (GNU Multiprecision Library). Jak już inni ci mówili, standardowe typy C++ są ograniczone. – orbitcowboy

Powiązane problemy