定點數與浮點數的差異:表示方式、範圍與精度、運算器規模、溢位、用途比較

定點數是預先決定小數點的位置,以與整數相同的位元串與運算器處理小數的方式。電路小、功耗也低,因此用於 DSP、沒有浮點運算器的微控制器,以及 AI 推論的整數運算。浮點數以符號、指數與尾數表示數值,以指數移動小數點的位置,因此能以幾乎固定的相對精度處理範圍極廣的數值。運算器雖然較大,但不必在意位數對齊就能使用,因此成為通用計算與 AI 訓練的標準。

項目定點數浮點數
表示方式將整數的位元串乘上預先決定的比例(2 的 −n 次方)來解讀。以 Q15 等表示以符號、指數、尾數 3 部分表示為 (−1)^符號 × 1.尾數 × 2^(指數 − 偏移值)。由 IEEE 754 規定
可表示的範圍(例)Q15(16 位元)為 −1 至 1 − 2⁻¹⁵單精度(32 位元)約為 10⁻³⁸ 至 10³⁸。以非正規數可更接近 0
精度間隔固定(絕對誤差固定)。值越小相對誤差越大相對精度幾乎固定(單精度約 7 位數)。值越大間隔也越大
運算器直接使用整數的加法器與乘法器需要指數比較、尾數對齊、正規化、捨入的電路
電路規模與功耗小。在相同位元寬度下遠少於浮點數大。面積與能量常為相同位元寬度之整數運算器的數倍以上
溢位的處理在 2 的補數中會繞回到另一端的值。以飽和運算或具有額外位元(保護位元)的累加器防止超過可表示的最大值時成為 ±無限大。0 ÷ 0 等為 NaN
比例調整由程式設計師估算數值範圍,並設計各運算的移位與小數點位置由指數自動調整,幾乎不需要在意
結果的再現性容易得到逐位元相同的結果加法的順序會使結果略有不同(結合律不成立)
使用場合DSP、沒有浮點運算器的小型微控制器、FPGA 或 ASIC 的訊號處理、AI 推論的整數運算(INT8 等)PC 與伺服器的通用計算、科學計算(倍精度)、圖形、AI 訓練(FP32、BF16、FP16、FP8)

數值為具代表性的大致參考值,會因世代或產品而異。

適用於什麼情況

定點數
想以小電路、低功耗進行數值範圍已預先知道的訊號處理時。聲音或通訊的濾波器、馬達控制、FPGA 實作、量化後 AI 模型的推論。
浮點數
數值範圍廣或無法事先得知的計算。科學計算、物理模擬、圖形、AI 訓練等,想優先考慮開發的便利性與數值穩定性時。
搭配使用
在 AI 中,越來越常以浮點數進行訓練,推論時則量化為乘上比例的整數(INT8 等),以類似定點數的整數運算器計算。

常見問題

為什麼定點數的電路小?

因為小數點的位置固定,可以直接使用整數的加法器與乘法器。浮點數每次相加都需要比較指數、對齊尾數,並將結果正規化與捨入的電路,因此面積與功耗變大。

定點數發生溢位時會怎樣?

與 2 的補數整數一樣,超過最大值就會繞回到最小值那一側,造成大的正值變成負值這類大誤差。DSP 以停在最大值或最小值的飽和運算,以及具有保護位元的寬累加器來防止。

使用浮點數就沒有誤差嗎?

不是。浮點數的位元數也是有限的,因此像 0.1 這類無法以二進位精確表示的值會有捨入誤差,也會發生相消誤差與大數吃小數。其優點在於可表示的範圍廣,且相對精度幾乎固定。

AI 推論使用 INT8 算是定點數嗎?

概念相近。將浮點數的值除以比例變成 INT8 整數,進行整數的乘積累加運算,最後再乘上比例還原。與定點數的差別在於,比例不限於 2 的冪次,可以依層或通道分別決定。

理解度檢測

在小型微控制器或DSP中,經常使用定點數而非浮點數運算,其主要理由為下列何者?

  1. A因為能以整數運算電路計算,電路小且耗電也少
  2. B因為定點數比浮點數總是能表示更廣的範圍
  3. C因為定點數完全不會產生捨入誤差
查看答案與解析

正確答案:A. 因為能以整數運算電路計算,電路小且耗電也少

定點數只需事先決定小數點的位置,其內容就是整數,因此加法與乘法可由整數電路進行。由於不需要浮點數運算器那種對齊指數或正規化的電路,可抑制晶片的面積與功耗,在低成本的微控制器或訊號處理用的DSP中很受重用。代價是可表示的範圍狹窄,設計時必須留意位數溢出與精度不足。範圍是浮點數較廣,而定點數也會產生捨入誤差。

16位元有號定點數的Q15格式(小數部分15位元),其可表示值的間隔(解析度)與範圍的組合,下列何者正確?

  1. A間隔 2⁻¹⁶,範圍 0~1
  2. B間隔 2⁻¹⁵,範圍 −1~1 − 2⁻¹⁵
  3. C間隔 2⁻¹⁵,範圍 −32768~32767
查看答案與解析

正確答案:B. 間隔 2⁻¹⁵,範圍 −1~1 − 2⁻¹⁵

Q15在16位元中以1位元作為符號、15位元作為小數部分,表示將當作整數讀取的值除以 2¹⁵ = 32768 後的值。將整數範圍 −32768~32767 除以32768,得到 −1~32767/32768 = 1 − 2⁻¹⁵,間隔為 1/32768 = 2⁻¹⁵ ≈ 3.05 × 10⁻⁵。須注意無法剛好表示+1。−32768~32767是不考慮小數點而當作整數讀取時的範圍。這是經常用於語音等訊號處理的格式。

將小數部分為8位元的定點數彼此以整數乘法器相乘時,對結果的處理下列何者正確?

  1. A結果也會直接成為小數部分8位元的格式,因此不需做任何處理
  2. B結果的小數部分會成為4位元,因此向左移4位元
  3. C結果的小數部分會成為16位元,因此要還原為原本的格式須向右移8位元
查看答案與解析

正確答案:C. 結果的小數部分會成為16位元,因此要還原為原本的格式須向右移8位元

小數部分8位元的數,是以實際的值乘上 2⁸ 倍後的整數來記錄的。兩者相乘後,會成為乘上 2⁸ × 2⁸ = 2¹⁶ 倍的值,結果的小數部分為16位元。要還原為原本小數部分8位元的格式,須除以 2⁸,也就是向右移8位元,必要時再進行捨入。由於乘法的結果位數會增加,中途通常以較寬的位元寬度計算。加法的話小數部分的位元數不會改變,但乘法則是相加。

  1. 在IEEE 754的單精度(32位元)浮點數中,分配給符號、指數部分、尾數的位元數組合為下列何者?
  2. bfloat16主要被用於AI訓練的理由為下列何者?
  3. 在AI推論中,將權重從FP32轉換(量化)為INT8的主要優點為下列何者?

前往電腦算術的練習題

相關名詞的解說

定點數
預先決定小數點位置,以與整數相同的位元序列表示小數的方式。可用整數運算電路計算,電路小且耗電低,但可表示的範圍狹窄。也有像Q15這樣以小數部位元數表示的。
IEEE 754
規定浮點數表示方式與運算規則的國際標準。規定單精度(32位元)、雙精度(64位元)等格式、捨入方法,以及無限大與NaN等特殊值,使計算結果不因電腦而異。
飽和運算
計算結果超出可表示範圍時,不因溢位而繞回另一側的值,而是停在最大值或最小值的運算。用於聲音與影像的訊號處理,以防止大誤差。
bfloat16
符號1位元、指數8位元、有效數7位元的16位元浮點格式。因指數與FP32相同,可表示的範圍廣,精度雖低但用於AI訓練。FP16為指數5位元、有效數10位元,精度高但範圍窄。
INT8
8位元的有號整數(−128〜127)。在AI推論中,將權重或激活值乘上縮放係數轉換(量化)為INT8,可大幅減少計算與記憶體,並以整數的小型電路高速處理。

相關的比較