2012-01-19 63 views
-2

我得到的問題是,如果我將一個大數字分配給一個浮點類型,例如float f = 1.0e20然後我將它打印到屏幕printf("f = %f\n",f),然後在屏幕上它將是f = 100000002004087730000.000000。誰能告訴我爲什麼數字顯示不是100000000000000000000.000000。提前致謝。大量存儲在C中的浮點數類型

+2

精度.......問題提出了很多次,並且在SO –

+0

上有很多形式http://web.cse.msu.edu/~cse320/Documents/FloatingPoint.pdf –

+0

請參見http:// stackoverflow。 com/questions/1839225/float-addition-promoted-to-double – Bingo

回答

2

您使用的號碼在您存儲的類型中沒有確切的表示。因此,答案永遠不會完全正確。

以類比的方式,考慮使用6位十進制數字的計算機。您可以爲1/3做的最好的是.333333但是然後3 * (1/3) != 1。好吧。

那麼2/3呢?如果您使用.666667,則使用2/3 != 2 * (1/3)。如果您使用.666666,則使用1/3 + 2/3 != 1。好吧。

這就是浮點數的方式。

0

總結,浮點變量表示爲aproximation的固定數字,稍後用指數進行縮放。在你的情況下,這個數字太大而無法以準確的方式存儲。改爲使用double,然後用%lf打印出來。它會更準確,但不要指望真正的平等。

+1

當然,在詢問之前,嘗試用自己的答案進行搜索。 – Adonais

+0

要打印'double's,使用'%f','l'修飾符在'f'轉換說明符之前不起作用。 –