2010-12-06 26 views
8

鑄造整數一個簡單的問題,我有以下代碼非常簡單 -關於C++

int x=15000 
int z=0.7*x 
cout<<"z = "<<z<<endl; 

我得到的輸出

z=10499 

,但如果我將其更改爲

int z=0.7*15000 
cout<<"z = "<<z<<endl; 

輸出

z=10500 

我知道它與z將結果轉換爲int 有什麼關係,但是爲什麼兩種情況都不一樣?

感謝,

編輯 - 我使用Ubuntu的10.10 GCC建立

+0

我有10500(gcc 4.2)...你在用什麼編譯器?這是你的代碼嗎? – Vladimir 2010-12-06 12:22:39

回答

4

INT Z = 0.7 * X;

雙精度值0.7不能完全表示爲浮點數;在大多數機器上它的十六進制表示是3fe6666666666666,它小於真實值3fe6666666666666 ...所以0.7 * x的雙精度結果小於它的真實值,並向下取整。這是正確的行爲。

int z = 0.7 * 15000;

另一方面,編譯器很聰明,可以看到0.7 * 15000完全可以表示爲7 * 1500 = 10500.所以它使用正確的結果,而不是通過編譯表達式獲得的結果並執行它。

6

我想這是因爲編譯器,是在編譯時簡化算術表達式。

第一個表達式使用FPU(有限精度)計算,第二個表達式使用預處理器(使用「無限」精度)。嘗試在發佈模式下運行程序(或使用-O2),結果對於這兩個表達式應該是相同的。

3

我認爲ruslik對你的問題有正確的答案。

我只是補充一點:始終保持您的計算結果爲float或double,直到最後一刻。這樣你就不會失去精確度。

試着改變你的代碼如下:

double z = 0.7 * 15000.0; 
cout<<"z = "<<z<<endl; // Will need to include some formatting 

int z = (int) (0.7 * 15000.0); 
cout<<"z = "<<z<<endl; 
+1

這兩個建議都是沒有用的,並且沒有辦法解決問題。 – TonyK 2010-12-06 12:35:08