浮點數表示誤差詳解


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)。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM