2013-04-03 43 views
0

下面的代碼給出了一些奇怪的結果:float操作在c中如何工作?大的數字,奇怪的結果

#include <stdio.h> 
#include <float.h> 

int main() 
{ 
    float t = 1.0; 
    float res; 
    float myFltMax = 340282346638528859.0; 
    printf("FLT_MAX %f\n", FLT_MAX); 

    res = FLT_MAX - t; 
    printf("res %f\n", res); 

    res = myFltMax - t; 
    printf("res myFltMax %f\n", res); 

    return 1; 

} 

的結果是:

FLT_MAX 340282346638528859811704183484516925440.000000 
res 340282346638528859811704183484516925440.000000 
res myFltMax 340282356122255360.000000 

所以,如果我減去1從FLT_MAX的結果是一樣的,如果我減去1從其他大流量中,結果大於初始數量。

我使用的是gcc版本4.7.2。 謝謝。

+6

...和提示[這個神奇的文件](http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html)! :) – unwind

+1

其實,如果你想得到或多或少的確切結果,你應該避免這樣的操作。如果數字具有相同的冪數爲10,您將得到最佳結果。 – Alex

+0

float(以及double或任何其他浮點格式)不具有無限精度 –

回答

3

如果從myFltMax中減去1,則不會獲得大於初始數值的差異。你得到相同的號碼。打印myFltMax以及你會看到它是340282356122255360而不是340282346638528859

Proof

基本上,編譯器會將340282346638528859四捨五入爲可以用浮點類型表示的最接近的值,這恰好是340282356122255360

+0

確實,結果是相同的,但爲什麼不會少於?我應該從該值中減去什麼以獲得不同的結果? – user2239352

+0

在評論中,您已經獲得了一篇精彩論文的鏈接。研究這個和浮點格式。 –