加入RUN!PC粉絲團
最近新增的精選文章
 
最多人點閱的精選文章
 
 
精選文章 - 開發技術
分享到Plurk
分享到FaceBook
 
淺談計算誤差
文/Iris.Liu 2019/6/6 下午 04:19:44

企業的主管在進行決策制定時常需要進行準則的取捨,這時一般都會針對準則進行評估,而正規化(Normalization)則是評估的常見方法,也就是將準則依權重比例的重新分佈,使其落於某一較小且特定的區間以進行比較。其目的無非是為達到幾個目的:

(一)資料精簡化,是為縮減資料的型別數目並預防不必要的複雜化;也就是為保證能更滿足需求。
(二)實現一致性,是為建立共同遵守的規則。
(三)一般化,則是在互換的基礎上擴大重複利用的好處。而常見的正規化方式有,極值正規化 (Min-max normalization)、Z-分數正規化(Z-score normalization) 及十進位正規化 (Decimal scaling normalization) 等。

然而,在計算後的資料表示上會出現一個問題,也就是除不盡的無限小數會導致誤差的累積。例如利用極值正規化(Min-max normalization)將數值映射至 [0-1] 區間中,誤差的累積可能使得計算的結果加總≠1。這種情況一般都會以分數的形式表示,以避免被誤以為是計算錯誤。

常見的計算誤差類型

這種計算上的誤差主要是因為電腦的浮點數只能儲存有限的資訊,無論是單精確度的 32位元,或是倍精確度的 64 位元,都會產生數值被忽略的結果。而常見的計算誤差類型有:

(一)四捨五入誤差(Round-off error)
例如 7除以 12 (7/12=0.5833…..),若只保留小數點後兩位,結果就是 0.58而非更精確的 0.58333……。

(二)溢位(Overflow) 與欠位(Underflow)誤差
因為電腦的數值計算以2進制為基礎。故若計算8位元的11110000 +10010000 = 110000000,即無法表示9位元的值,也就是計算結果超出資料所能表示,就被稱為溢位 (Overflow);反之,若數值小到無法表示,就被稱為欠位。

(三)近似誤差 (Approximation error)
依浮點數的大小及應用的計算工具的精確度,所取的近似值與真實值之間的差異所引起的誤差。

除了電腦的浮點數計算會產生誤差,利用Microsoft Excel 、或是常見的程式設計語言做為計算工具,也會有類似的情況發生喔!主要是因為這些計算工具與電腦的浮點數計算的 CPU都採用有關儲存及計算浮點數的 IEEE 754 為基礎。

IEEE-754 浮點數值計算

IEEE 754 是IEEE 電腦協會標準委員(Standards Committee of the IEEE Computer Society)的微處理器標準組(Working Group of the Microprocessor Standards Subcommittee)中的浮點數工作組 (Floating-Point Working Group),針對硬體、軟體、或是由軟硬體組合而成的系統的浮點數計算訂定規則。該標準定義了二進制與十進制的浮點數計算的商業化可行方向。因此,無論是微處理器、商用套裝軟體及程式設計語言等實體中的浮點數計算都參考了 IEEE 754 標準。

不過,就像Microsoft的 SQL Server 應用的是T-SQL (Transact-SQL) ,Oracle 資料庫用的是 PL/SQL (Procedural Language/SQL),以及IBM 的資料庫應用的是 SQL PL。雖然這些資料庫的查詢語言雖然都會被簡略稱為 SQL,其格式類似卻有許多的不同之處,也都各有其擅長之處。

像Microsoft Excel 就有不完全依循 IEEE 754 的項目。如:

(一)取消正規化的數字是以指數 0 表示。因此,精確度就會差一點,尤其當你運用的數字越小,精確度就越低。

(二)Excel 不支援無限大(∞),也就是針對溢位的處理,Excel會以「#DIV/0!」錯誤訊息表示。

(三)非數字 (Not a Number,NaN) 的處理:NaN 是用來表現未定義值域的情況,例如∞/∞、或是0/0。Excel 會以「#NUM!」或「#DIV/0!」等錯誤訊息表示。

標準化的目的是為透明性及公平性

ISO/IEC Guide就指出,標準化是在一定的範疇內針對現存或潛在的問題,建立有關共同性、經常使用的條款,以期達成最適宜的等級秩序的活動。而活動包括了標準的制定、發行及實施等程序。而標準化主要的優點是改良產品、加工及服務的適合性,以切合其既定的目標,以預防貿易上的障礙並促進工業技術的合作。其目的無非在達到透明性及公平性。