2014-01-19 121 views
0

我們知道在C中,單精度浮點範圍是從1.xxxx * 10^-38到3.xxxx * 10^38。c中的浮點運算

在我的演講稿有這樣的操作:

(10^10 + 10^30) + (-10^30) ?= 10^10 + (10^30 + -10^30) 
10^30 - 10^30 ?= 10^10 + 0 

我不知道爲什麼10^10 + 10^30 = 10^30在這種情況下?
我的想法是,由於FP的範圍可以降到10^-38和10^38,所以不應該有溢出,所以`10^10 + 10^30不應該最終成爲10^30。

+5

您應該檢查幻燈片的其餘部分,浮動點也僅限於顯著位數。所以結果是四捨五入的,而不是確切的。 – Nabla

+1

@ yklee1013「我們知道在C中,浮點範圍是...」在C中沒有指定。在C中,_minimum_「float」範圍從1E-37到1E + 37。有關精度的想法:FLT_DIG的最小值是6,FLT_EPSILON的最大值是1E-5。 C11§5.2.4.2.2。在選擇平臺(10^10 + 10^30)=(-10^30)上浮動不足爲奇,精度不夠。 – chux

回答

2

正如您對問題的評論所說,存儲數字的部分是有限的。它被稱爲有效數字。

考慮以下簡單14位格式:

[符號位] [5位指數] [8位有效]

讓 '偏壓' 是16,即,如果指數爲16,它實際上是0(這樣我們就得到一個良好的範圍或+/-權力) 並沒有隱含位

所以如果我們在格式有一個數字2^8除了像2048和0.5

更大:

2048 = 2^11 = [0] [11011] [1000 0000]

0.5 = 2^-1 = [0] [01111] [1000 0000]

當我們添加這些數字我們轉向指數使它們具有相同的小數位數。十進制的比喻是:

5×10^3 + 5×10^-2 => 5×10^3 + 0.00005×10^3

所以siginifcand斜面保持12個地方:

2^11 + 0.000000000001×2^11 = 1.000000000001×2^11

所以其四捨五入回2^11

0

本質是的顯著數字的概念。對於IEEE754 float,它大約爲7位十進制數字。如果我們用假設的十進制浮點數字與7個顯著數字,計算是這樣完成的:

10^10 + 10^30 == 1.000 000 * 10^10 + 1.000 000 * 10^30 
       == (0.000 000 000 000 000 000 01 + 1.000 000) * 10^30 (match the exponent part) 
       => (0.000 000 + 1.000 000) * 10^30 (round the left operand) 
       == 1.000 000 * 10^30 
       == 10^30 

然而要注意的匹配操作和取整運算作爲一個單一的步驟,即完成。該機器永遠不能處理具有太多有效數字的0.000 000 000 000 000 000 01 * 10^30

順便說一句,如果你對浮點算術用C進行實驗,你會發現%a格式說明有用的(在C99。引入)但是請注意,printf總是隱float參數轉換爲double

​​