2017-07-26 27 views
-2

我新的C++和我不斷收到相同的值變 'W' ..爲什麼總是收到每次迭代變量的值相同? C++

#include <iostream> 
#include <string> 

#define NOEXE 10 
#define winit 0.9 
#define wfinal 0.2 

int main() 
{ 
    for (int nExeNo = 0; nExeNo<NOEXE; nExeNo++) 
    { 
     double w; 

     w = (((NOEXE - nExeNo)/NOEXE)*((NOEXE - nExeNo)/NOEXE))*(winit - wfinal) + wfinal; 
     std::cout << w << "\n"; 
    } 
} 

和輸出

0.9 
0.2 
0.2 
0.2 ....... 
+1

作爲一個側面說明,您應該使用const變量而不是那些'#define'指令。 – Ron

回答

1

(NOEXE - nExeNo)/NOEXE在整數運算完全完成。由於nExeNo < NOEXE整個以前的表達式始終爲零。

因此,你所剩下的只是最後一個學期wfinal

要強制浮點運算,至少一個操作數必須是一個浮點型(在你的情況下,雙)的。因此,要清理,並擺脫討厭的宏,定義常量,如下所示:

constexpr int NOEXE = 10; // use const instead of constexpr for C++03 
constexpr double NOEXE_D = NOEXE; 
constexpr double winit = 0.9; 
constexpr double wfinal = 0.2; 

和使用計算NOEXE_D代替。即(NOEXE_D - nExeNo)/NOEXE_D)

+0

加入 雙noexe = NOEXE; 雙nexeno = nExeNo;在w解決問題之前,使用 。謝謝!! –

+1

@YasirDharala - 循環使用雙「索引」是不明智的。如果NOEXE變得太大,你會得到不穩定的行爲。 – StoryTeller

0

這是因爲NOEXEnExeNo是整數,並且如此與他們個人計算舍入爲最接近的整數:NOEXE - nExeNo)/NOEXE將始終被四捨五入爲1或0。這將被舍入到1對於第一次迭代,然後0爲所有的程序。

如果更改NOEXE爲float它應該工作

#define NOEXE 10.0 

,其結果將是如下

0.9 
0.767 
0.648 
0.543 
0.452 
0.375 
0.312 
0.263 
0.228 
0.207 

一般來說,它是很好的做法,定義類型和使用const而比#define

0

這是因爲你正在做整數除法,而不是像你想的那樣漂浮一個

讓我們專注於(NOEXE - nExeNo)/NOEXE)部分環路

for (int nExeNo = 0; nExeNo<NOEXE; nExeNo++) 
{ 
    double w; 

    w = (((NOEXE - nExeNo)/NOEXE) 
    std::cout << w << "\n"; 
} 

你可以看到打印出來作爲

1 
0 
0 
... 

解決這個問題的最快方法是定義NOEXE浮點

#define NOEXE 10.0 

或鑄運營商之一翻番

w = (((NOEXE - nExeNo)/(double)NOEXE)*((NOEXE - nExeNo)/(double)NOEXE))*(winit - wfinal) + wfinal; 
相關問題