1. 程式人生 > 實用技巧 >浮點數的定點化

浮點數的定點化

一、概念

1、浮點數:小數點位置是漂浮不定的。

  例如:浮點數運算 1.1 * 1.1 = 1.21,小數點位置發生了變化。

2、定點數:小數點的位置是確定的。

  例如:定點數運算 1.1 * 1.1 = 1.2,小數點的位置沒有變化。

二、Verilog表示定點數

  FPGA 的暫存器只可以表示正整數,通過約定【最高位為符號位】則可以表達負整數了。同理,帶小數點的定點數也是可以通過一些約定來表示。

  約定方法:確定小數點的位置。如下圖所示,Qn表示小數點的位置,n為多少表示有多少位小數,看看同樣的二進位制數字“10101”會變成什麼。

二進位制數    小數點位置    對應定點數
 
10101 Q0 10101 10101 Q1 1010.1 10101 Q2 101.01 10101 Q3 10.101 10101 Q4 1.0101 10101 Q5 0.10101

  因此我們只要定位了小數點位置後,就可以在FPGA中表達帶小數的定點數。

三、浮點數的定點化

  兩個 16 位的浮點數運算,最高位是符號位:2.918 * 3.1415926 = 9.1671672068,嘗試將浮點數進行定點化。

1、定點轉換(Qn=12)

  符號1位,整數3位,小數12位,可以看成把 1 分成了 212

份,因此:

  • 2.918 * 212 = 11952.168 = 11952;
  • 3.1415926 * 212 = 12867.8632896 = 12868;

2、定點數相乘

  11952 * 12868 = 153798336。

3、結果還原

  相乘後,整數部分為 6 位,小數部分為 24 位。因此結果 = 153798336 / 224 = 9.167095184326171875,和結果的差距非常小。

4、量化誤差和量化精度

  小數點的位置不同帶來的量化誤差不同,例如上面定點轉換的過程中出現的小數點進行了四捨五入,這是因為 2.918 無法完全用 1/212來表示。小數位數越多,表示的量化精度越高,小數位為 Qn

,最大量化精度為 1/2n

5、無損定點化

  所謂【無損定點化】只是數學概念,只要量化誤差小於精度的一半,就認為是“無損”的。按照這個標準,那對小數點採取四捨五入的結果必然是無損的。但是校招時很多題採取的是“量化後直接去除小數”,那麼小數大於 0.5 則不是無損的了。

四、例題

1、【大疆】對 12.918 做無損定點化,需要的最小位寬是多少位?位寬選擇 11 位時的量化誤差是多少?

A   13位,0.0118
B   12位,0.0118
C   13位,0.0039
D   12位,0.0039

  分析:(1)整數為12,需要 4bit,接著考慮小數需要多少 bit。假設需要12位,即小數需要 8bit,12.918 * 28 = 3307.008,出現0.008的小數,其值小於0.5,可以看成是【無損定點化】,固第一問答案為 12 位;(2)位寬選擇11位,即小數需要 7bit,12.918 * 27 = 1653.504,出現0.504的小數,量化誤差為0.504/27 = 0.0039375,固第二問答案為0.0039。

  答案:結合分析,得出答案為D。

2、【大疆】對12.758做無損定點化,需要的最小位寬是多少位?位寬選擇為8位時的量化誤差是多少?

A   11位,0.008
B   11位,0.08
C   12位,0.008
D   12位,0.08

  分析:(1)整數為12,需要 4bit,接著考慮小數需要多少 bit。假設需要11位,即小數需要 7bit,12.758 * 27= 1633.024,出現0.024的小數,其值小於0.5,可以看成是【無損定點化】,固第一問答案為 11 位;(2)位寬選擇 8 位,即小數需要 4bit,12.758 * 24 = 204.128,出現0.128的小數,量化誤差為0.128/24 = 0.008,固第二問答案為0.008。

  答案:結合分析,得出答案為A。

  我感覺這題的第一問有些問題,位寬為 8 位時也是符合【無損定點化】的,我算了一下,實際上到位寬為 7 位(小數為3位)時,仍然是【無損定點化】,位寬為 6 位時才不是【無損定點化】。但這是選擇題,只能選 A 了。

參考資料:https://www.cnblogs.com/bixiaopengblog/p/7728538.html