1. 存儲結構
計算機存儲浮點數采用IEEE754標准,其結構為:
![]()
數符s:0表示該數為正,1表示該數為負。占1bit大小。
階碼e:采用移碼表示,即加上了一個固定的偏移。階碼全為1表示無窮大。
尾數f:尾數數值最高位1被隱藏,所以實際的尾數數值為1.f。在將數轉為浮點數時,小數點左邊也就必須是1的這種形式。
真值的計算方法為:val = s * 1.f * 2e-offset

float類型的最大數值為:1.111...11 X 2127 = 1.89045759400... * 1038
2. 浮點數表示產生誤差原因
a. 由於計算百機內部以二進制保存,所以十進制的有限位的小數,在計算機內部會是一個無限位的小數。
例如: 十進制的0.9雖然只有一位小數,轉成2進制道是無限循環小數0.1110011001100110011...
b. 計算機保存浮點數的精度有限,例如float可以保留十進制最多7位(二進制23位)有效數字,
double可以保留十進制15-16位(二進制52位)有效數字。那有效數字以后的位就被忽略了。
例如:0.9的表示受精度所限,精度以后的就被忽略了,這樣
float時,它是0.89999998
double時,它是0.90000000000000002
即:除了可以表示為2的冪次以及整數數乘的浮點數可以准確表示外,其余的數的值都是近似值。
3. 舍入方法
既然十進制的有限位小數,在計算機內部可能是一個無限位小數,那就存在舍入策略。
假定經過運算后的數共有p+q位,現僅允許保留前p位。舍入方法有許多種,常見的舍入方法有:
a. 恆舍(切斷):多余部分q位一律舍去,保留部分的p位不作任何改變。
b. 恆置1法:即不論多余部分q位為何代碼,都把保留部分p位的最低位置1。
c. 下舍上入法:即0舍1入,相當於十進制中的四舍五入。用將要舍去的q位的最高位作為判斷標志,以決定保留部分是否加1。
如該位為0,則舍去整個q位(相當於恆舍)。如該位為1,則在保留的p位的最低位上加1。
4. 浮點數的比較
浮點數比較的時候需要用一個很小的數值來進行比較。當二者之差小於這個很小的數時,就認為二者是相等的了。
而不能直接用== 或!=比較。這個很小的數,稱為精度。
精度由計算過程中需求而定。比如一個常用的精度為1e-6.也就是0.000001.
所以對於兩個浮點數a,b,如果要比較大小,那么常常會設置一個精度。
a. 判斷等於的時候,就是:if(fabs(a-b) <= 1e-6)。fabs是求浮點數絕對值的函數。
b. 判斷大於的時候,就是:if(a > b && fabs(a-b) > 1e-6)。
c. 判斷小於的時候,就是:if(a < b && fabs(a-b) > 1e-6)。
