2012-12-04 238 views
0

我正在運行一些簡單的if語句循環。在這個for循環中,3個變量將根據for循環中的索引值被賦予一個值。這看起來相當簡單,但是,當我運行代碼時,值始終爲零,我不知道爲什麼會發生這種情況。我的for循環在下面提供。我很欣賞任何建議。C++變量始終爲零

double A [N+1]; 
double r; 
double s; 
double v; 
for(int i = 2; i < N+1; i++) 
{ 
    if(i == 2) 
    { 
     r = 1/2/i/(i-1); 
     s = -1/2/(i*i - 1); 
     v = 1/4/i/(i+1); 
    } 
    else if(i <= N-2 && i > 2) 
    { 
     r = 1/4/i/(i-1); 
     s = -1/2/(i*i - 1); 
     v = 1/4/i/(i+1); 
    } 
    else if(i <= N-4 && i > N-2) 
    { 
     r = 1/4/i/(i-1); 
     s = 0; 
     v = 1/4/i/(i+1); 
    } 
    else 
    { 
     r = 1/4/i/(i-1); 
     s = 0; 
     v = 0; 
    } 

    A[i] = r*F[i-2] + s*F[i] + v*F[i+2]; 
    cout << r << s << v << endl; 

} 
+2

怎麼樣調試呢? – duedl0r

回答

15

這是因爲你正在使用整數除法。舉個例子:

r = 1/2/i/(i-1); 

這是一樣的:

r = ((1/2)/i)/(i - 1); 

這是一樣的:

r = (0/i)/(i - 1); 

...這是一樣的:

r = 0/(i - 1); 

...這是0

因爲1/20整數運算。要解決這個問題,請使用浮點值。

+0

我認爲將變量聲明爲double會照顧到這一點。我想我錯了。感謝您的澄清。 – user1562781

+2

你怎麼這麼快輸入的?:) – Nim

+0

我在想同一件事情Nim :-) – sakthisundar

2

1,2和4是整數。在整數區域1/2 = 0和1/4 = 0中

1

整數,1/2爲零。我建議(開始時)將2等常數改爲2.0,以確保它們被視爲雙打。

您可能還需要(雖然它可能不是必要的)投你的所有i變量浮點值,以及,只是爲了完整性,如:

r = 1.0/2.0/(double)i/((double)i - 1.0); 

事實上,r是雙絕不會影響=右側的計算。它隻影響最後一位(實際分配)。

4

三件事:

  1. else if(i <= N-4 && i > N-2)是沒有意義的,這一條件不能抱
  2. 所有的部門都是整數除法 - 修復,轉換的數字爲雙之一。
  3. 作爲1的結果,當i = N-1,並且i = N時,那麼最後一個分支將被用於強制兩個變量爲0的地方!
0

由於整數除法,1/2,1/4和-1/2總是爲零。所以試着用1.0/2.0,1.0/4.0和-1.0/2.0來快速排序。但請遵循基本原則,不要在代碼中使用許多幻數。考慮爲它們創建常量並使用。