數值計算的誤差來源

IEEE 754 format

我們知道早期的電腦是用真空管通電不通電來到作為紀錄數值的方式,從很大的真空管進步到現在小小的晶片,所使用的就是二進位的數係表示與計算。IEEE 二進位浮點數算數標準,簡稱IEEE 754,是20世紀最廣泛使用的浮點數運算標準。我們可以參考維基百科上面的簡介

IEEE 754 format on wiki

數值資料的浮點數表示如上圖所示,藍色部份的一個位元用來代表數值的正負符號,這裡指的位元當然是二進位的,其值只能是0或1。接下來綠色的部分是紀錄指數的部分,紅色的部分是數值的部分。亦即,數字是用科學記號表示法的方式儲存 \(s\cdot a \cdot 10^b\) ,s 是正負,a 是數值,b 是指數。我們常見的浮點數有兩種,一種是32位元的,一種是64 位元的,分別代表用32 個位元組或是64 個位元組來表達一個數字,差別在於可以表達數字的精準度與範圍。詳細的內容維基百科上有很清楚的介紹,我們必須有的直覺是大多數的數字儲存在電腦理都會有一個約\(10^{-16}\) 次方的誤差,這個誤差透過計算方法的放大或計算過程的累積會對計算的結果造成一些影響。

下面是Python 下的指令,可以找出在不同位元表示下所能顯示的最小數字,稱為machine epsilon。

 

import numpy as np
np.finfo(np.float32).eps
np.finfo(np.float64).eps

 

我們可以得到32位元的最小數字是1.1920929e-07,而64 位元的最小數字是2.2204460492503131e-16,一般來說沒有特別設定我們都是用雙精度來計算,亦即是64位元的表示法,也因此我們大概要知道,一般的數字表示會有大約\(10^{-16}\)的誤差。