2014-06-21 146 views
1

我想寫兩個循環在一個for循環,所以我擡頭多個變量的語法在for循環for循環多個可變,第二個變量沒有更新

問題是第二個變量l不更新我不知道爲什麼

#include<iostream> 
using namespace std; 

int main() 
{ 
    float vsum=0, lsum=0; 
    double nsum=0, msum=0; 
    float v=1, l=100000000; 
    for (v, l ; v<= 100000000, l >= 1 ; v++, l--) 
    { 
     vsum= vsum + 1/v; 
     nsum= nsum + 1/v; 
     lsum= lsum + 1/l; 
     msum= msum+ 1/l; 
    } 
    cout << " The float sum of all numbers 1 through 1/100000000 is " << vsum << endl; 
    cout << " The double sum of all numbers 1 through 1/100000000 is " << nsum << endl; 
    cout << "The float sum of all numbers 1/100000000 through 1/1 is " << lsum << endl; 
    cout << "The double sum of all numbers 1/100000000 through 1/1 is " << msum << endl; 
    cin >> vsum; 
} 
+0

請使用縮進 - 使代碼易讀 –

+2

爲什麼你認爲第二個變量沒有更新?它似乎對我來說完全正確。 – merlin2011

+1

這個逗號表達式不會做你認爲應該做的事:'v <= 100000000,l> = 1'。它只檢查第二個變量(從技術上講,它也會檢查第一個變量,但會丟棄結果)。最終結果本身與「l> = 1」相同。 – dasblinkenlight

回答

2

我想你的問題是,經過

float f = 100000000; 

爲什麼--f;離開f不變?

答案是由於粒度爲floatfloat沒有足夠的精度來存儲每個可能的整數。例如,顯然32位浮點數不能存儲與32位整數一樣多的整數值。

距離0越遠,得到的差距越大,float的連續可能值之間的差距就越大。在你的系統100000000 - 1仍然大於下一個可能的浮動值,低於100000000

C++的規則是,當計算結果不能完全由浮點表示時,則使用實施定義來確定是使用次最低值還是次高值。 (所以你的編譯器應該實際記錄這裏發生的事情)。在這種情況下,您的系統正在使用次高值。

爲了得到您的預期結果,使vl爲整數類型,並在實際計算中進行浮點轉換,例如,

vsum += 1.f/v; 
nsum += 1.0/v; 
1

由於dasblinkenlight提到,你只檢查第二個條件,但第二個變量更新就好了。這是一個證明這一點的簡略例子。

#include<iostream> 
using namespace std; 
int main() 
{ 

    float vsum=0, lsum=0; 
    double nsum=0, msum=0; 
    float v=1, l=10; 
    for (v, l ; v<= 10, l >= 1 ; v++, l--) 
    { 
     cout << v << " " << l << endl; 
    } 
} 

輸出:

1 10 
2 9 
3 8 
4 7 
5 6 
6 5 
7 4 
8 3 
9 2 
10 1