2014-02-05 17 views
-4

任何人都可以解釋爲什麼下面的代碼會產生不同的結果嗎?有兩次移位操作的C/C++分區

double zaehler = -20; 
double teiler = 0.08; 
printf("ergebnis = %d \n", ((int) (zaehler/teiler)) << 7); 
printf("ergebnis = %d \n", (int) (-20/0.08) << 7); 

結果:

ergebnis = -31872 
ergebnis = -32000 

非常感謝提前

+0

他們對我都打印-32000(結果我的預期)。你確定你粘貼的代碼是正確的嗎?你使用什麼編譯器? – TypeIA

+0

[Can not repro](http://coliru.stacked-crooked.com/a/dc428c5f024dd909) – Borgleader

+0

也許 - 在一個你有兩個內存位置雙「精度」,浮點錯誤。另一方面,你有兩個文字,具有精確的值,即在低位沒有錯誤。即變量_teiler_可能看起來像內存中的0.080000000234526 – ryyker

回答

0

一個非常小的舍入差,對於64個80位之間的差可能的範圍內,可以解釋爲不同的輸出。截斷到int和shift的組合可以放大一個微小的差異。這個程序:

#include <stdio.h> 
int main(){ 
    double zaehler = -20; 
    double teiler = 0.08; 
    printf("ergebnis = %d \n", (int) (zaehler/teiler)); 
    printf("ergebnis = %d \n", (int) (-20/0.08)); 
} 

打印:

ergebnis = -249 
ergebnis = -250 

如果分割給出了一個答案,即使一點點小於250截斷爲int會得到249.我建議四捨五入,而不是截斷。

Eclipse中,MinGW的:

Info: Internal Builder is used for build 
g++ -O0 -g3 -Wall -c -fmessage-length=0 -o main.o "..\\main.cpp" 
g++ -o TestCPP.exe main.o