有一段代碼讓我迷惑,它運行在windows中! 下面是代碼:在windows中傳遞函數的奇怪,浮點型參數
#define point_float2uint(x) *((unsigned int *)&x)
float divide_1000(float y)
{
float v = y/1000.0f;
return v;
}
float divide_1000(int y)
{
float v = float(y)/1000.0f;
return v;
}
void float_test(void)
{
int num[5] = {67975500, 67251500, 67540620, 69435500, 70171500};
for (int i = 0; i < 5; ++i)
{
int a = num[i];
float af_f = divide_1000(float(a));
float af_i = divide_1000((a));
printf("src num:%d, af_f:%f, %x, af_i:%f, %x\n", num[i], af_f, point_float2uint(af_f), af_i, point_float2uint(af_i));
}
}
這裏是輸出,通過VS2005編譯:
src num:67975500, af_f:67975.507813, 4784c3c1, af_i:67975.500000, 4784c3c0
src num:67251500, af_f:67251.507813, 478359c1, af_i:67251.500000, 478359c0
src num:67540620, af_f:67540.625000, 4783ea50, af_i:67540.617188, 4783ea4f
src num:69435500, af_f:69435.507813, 47879dc1, af_i:69435.500000, 47879dc0
src num:70171500, af_f:70171.507813, 47890dc1, af_i:70171.500000, 47890dc0
的問題是:爲什麼我使用 「divide_1000」,得到了不同的結果在窗口?這不是我想要的! 我發現並非所有的整數都有不同的結果,但有些就像上面的代碼一樣。
這裏是輸出,通過gcc4.4.5在Debian的comipled:
src num:67975500, af_f:67975.507812, 4784c3c1, af_i:67975.507812, 4784c3c1
src num:67251500, af_f:67251.507812, 478359c1, af_i:67251.507812, 478359c1
src num:67540620, af_f:67540.625000, 4783ea50, af_i:67540.625000, 4783ea50
src num:69435500, af_f:69435.507812, 47879dc1, af_i:69435.507812, 47879dc1
src num:70171500, af_f:70171.507812, 47890dc1, af_i:70171.507812, 47890dc1
我得到期運用不同的功能相同的結果 「divide_1000」。這就是我想要的。
請閱讀[每位計算機科學家應瞭解的浮點算術知識](http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html)。 –
@JoachimPileborg這裏的問題可能是例如爲什麼在其他編譯器中結果不同,他們處理的是哪種優化? – DRC
@Joachim Pileborg謝謝你的幫助。但我想我知道Floating-Point有什麼問題。讓我困惑的是,爲什麼第一種方式和第二種方式有不同的結果? 「每位計算機科學家應該知道什麼是浮點運算」有答案嗎? – hdbean