2013-06-24 29 views
1

我在斐波那契序列發現更大的那個我得到負數after a certain point作爲數字輸出怪異得到Fibonacci序列中

267914296 433494437 701408733 1134903170 
1836311903 -1323752223 512559680 -811192543 -298632863 

這是否有「INT」的限制範圍呢?或者我的代碼有什麼問題?

下面是代碼:

using std::cout; 

int main() 
{ 

int n = 50, f1 = 0, f2 = 1, fn = 0, i = 0; 

cout << "0 "; 
for (i = 0; i < n; i++) 
{ 
    fn = f1 + f2; 
    f2 = f1; 
    f1 = fn; 

    cout << fn << " "; 
} 
+2

'這是否與「int」的有限範圍有關?是的,很有可能。如果它發生在2G左右,是的,這就是它。一個簡單的測試就是使用'long long int'並且看看它是如何運作的。 –

+0

答案在什麼時候變爲負值?但我會冒險「是的,這就是爲什麼」。 –

+0

你在哪一點開始變得奇怪的數字? –

回答

2

是的,這與int的有限範圍有關。這被稱爲翻車溢出,和您的汽車裏程表一樣工作。一旦數字通過了它的最高可能值,它就會回到其最低可能值(int爲負數)。考慮使用unsigned intlong unsigned int,儘管第二個不需要更長的時間(這取決於平臺)。 A long double可以容納更大的數字。如果您想使用任意大數目(儘可能大),您可以在this question的答案中找到合適的庫。

+0

雖然* wraparound *(另一個名稱)是有符號整數溢出時很多平臺的常見行爲,但請注意C++實際上將帶符號整數溢出視爲* undefined behavior *;換句話說,程序在一些整數溢出的時候被破壞。 –

2

我敢打賭,它確實有一些做與int的範圍。你可能溢出

的整數通常有32位,這些位中的一個是符號,所以如果你有一些像

01111111111111111111111111111111 

是超過2十億一點點,你添加2它,那麼你得到

10000000000000000000000000000001 

是負的(第一個數字是符號,0爲正,1爲負),如果你想存儲多個N

每個人,你可以使用長整數。

0

嘗試使用「long int」而不是「int」。

+2

這是如何比已經接受的答案更好,這是一個很好的解釋嗎? – yakobom

+1

它的評論不是答案 – Gahan

+1

這不提供問題的答案。一旦你有足夠的[聲譽](https://stackoverflow.com/help/whats-reputation),你將可以[對任何帖子發表評論](https://stackoverflow.com/help/privileges/comment);相反,[提供不需要提問者澄清的答案](https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-c​​an- I-DO-代替)。 - [來自評論](/ review/low-quality-posts/17235254) – Vega