2018年12月4日 星期二

淺談浮點數

大家都知道電腦是二進位系統的計算機器,可快速計算龎大的數值
那的二進位的數值該如何表示呢?

在數學上我們大致會將實數有理數和無理數,無理數如圓周率 3.14.5.... 在小數點後可有無窮位數的延伸,電腦運算會有精確度的問題, 只找一個有理數去做逼近。

這裡我們先來談談的有理數,有理數必定可表達為兩個整數相除(分數形式)
ex:   1.5 = 3/2

那我們首先要解決在電腦中整數的二進位表達與運算的問題,二進位的表達我們在之前的文章已經討論 過了,接下來要討論的是,不全然是整數時電腦該如何表達與運算,電腦通常管這種不全然為整數的數值表示法為浮點數(float point)

電腦的整數表示法有最大值和最小值的限制
在整數運算過程中超出最大值時會產生溢位問題
而浮點數表示法可表達的最大值到最小值的範圍卻遠大於整數表示法
不過…
相對於整數,在電腦中的浮點數會有精確度的問題
先以大家比較能接受的十進制的表示法來舉例:
像我們表達 12351234567893123.46879879879686546465465465465432132112321
這一個數值時可能只能精確到
                     12351234567893000
       
          而表達 0.00000000000012345645654654631321555
這一個數值時可能只能精確到
                      0.000000000000123456

由上面的例子你應該會注意到數值的精確度並不是我們熟係的"小數點後第n位"
當數值很大時有可能連百位數都是不精確的

為什麼會這樣?  因為表達浮點數的位元數是有限的(ex:32位元),硬要表達很大的數值時就只好把相對較小的位數捨棄掉了,這裡我們就來看看目前大部分PC通用的 IEEE 754 浮點數表示法如何運算 : 文字說明參考連結