鑄造整數一個簡單的問題,我有以下代碼非常簡單 -關於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建立
鑄造整數一個簡單的問題,我有以下代碼非常簡單 -關於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建立
INT Z = 0.7 * X;
雙精度值0.7不能完全表示爲浮點數;在大多數機器上它的十六進制表示是3fe6666666666666,它小於真實值3fe6666666666666 ...所以0.7 * x的雙精度結果小於它的真實值,並向下取整。這是正確的行爲。
int z = 0.7 * 15000;
另一方面,編譯器很聰明,可以看到0.7 * 15000完全可以表示爲7 * 1500 = 10500.所以它使用正確的結果,而不是通過編譯表達式獲得的結果並執行它。
我想這是因爲編譯器,是在編譯時簡化算術表達式。
第一個表達式使用FPU(有限精度)計算,第二個表達式使用預處理器(使用「無限」精度)。嘗試在發佈模式下運行程序(或使用-O2
),結果對於這兩個表達式應該是相同的。
我認爲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;
這兩個建議都是沒有用的,並且沒有辦法解決問題。 – TonyK 2010-12-06 12:35:08
我有10500(gcc 4.2)...你在用什麼編譯器?這是你的代碼嗎? – Vladimir 2010-12-06 12:22:39