|
主題:定點數小數表示法
H+ F1 s- J; Q& G; @8 n使用範圍:使用整數運算系統下之小數運算, O% ?, `; G; G3 [
參考資料:嵌入式系統構件 Jean J. Labrosse原著 黃文增譯 全華科技圖書出版0 O1 ?; d$ I$ l t& ?4 ~; Z# a
原理說明:+ [2 z1 ~& |8 k7 G+ ?: e
先復習一下計算機概論,有許多人都還給老師了。"^"表示次方運算
" c' E* j# L4 F: @101.101b=2^3+2^0+2^-1+2^-3=5.625
4 h+ K8 k- U. I' E現在是如何運用到FPGA上了。其實這個問題在之前的定點數DSP就遇過了,只是後來應用變少了。現在的FPGA又要用,捲土重來。
% P+ ?. S6 |! K( x% ]我們知道FPGA對於整數系統的加減法是可以,但是遇到小數有些人就不知該如何。其實不難,只要在整數運算系統上加上小數點就行了。7 f* `. Y7 J5 A: }3 B
例如101.1b+101.1b=1011.0b,可以發現去掉小數點就和整數運算沒有兩樣。意指,只要將小數點那個位數對齊就可以了,使用移位對FPGA是很容易的。8 Q3 A" l6 G1 g o. V* N! L
但是整數運算使用為小數要標示小數位置,所以引入類似科學記號表示法。我們知道科學表示法為<尾數>E<指數>,例:3E3=3*10^3=3000,E表示10的次方。6 s5 Z2 d6 {9 o8 V9 m
定點數的表示法符號為S,表示法為<尾數>S<指數>,S表示為2的次方。舉例2.5S3=2.5*2^3=2.5*8=20。
! ]4 H6 v: G9 y7 J在基本數學運算下的處理為:" H# Z: X7 V, [
1.加減法% Y' E/ @, G, z+ [( K/ s
處理方式是將小數位數對齊再做運算。例:2S3+3S2=20S2+3S2=23S2
, o+ {* V5 L/ R4 Z3 l; t# j2.乘除法
7 @3 \ M/ ]" q8 T乘法時要將指數相加,尾數相乘。例:2S3*3S2=6S5& z& Q# I4 N C, s! k: }& }
除法時要將指數相減,尾數相除。例:2S3/3S2=0.66S1- F* ]7 U' ^ G2 y# n# X8 w
3.開根; b5 ^- ?) h% x
主要是推導數學運算對指數的影響。# X$ U* `- V' n2 u- q2 U/ u7 M( T
sqrt(aSb)=sqrt(a)*sqrt(2^b)=sqrt(a)*2^(b/2)8 ^. U. m" c6 T6 I1 }
可以發現在開根時指數是除2,尾數直接開根。8 w2 `0 r# o, u# A1 o, o
4.小數精度的選用
! T- N- e6 K/ L2 K# v為了符合精度,要如何選用指數範圍。我們使用定點數其精度取決於二進位小數取多少位。9 ]2 c3 c9 L1 [2 P2 ?$ y) I
例如若是使用S-4為其指數,每二數之間最小距離為2^-4=0.0625。此為S-4下的精度。
, O, M8 S: d7 s' V! g/ j對應十進位精度可以使用log(精度)/log(2)去計算要使用的指數。. i1 V3 o; l1 l" I" y& l* b2 O
使用精度0.1則S取用為log(0.1)/log(2)=-3.32,則使用S-4為其數值格式,就夠用了。
. i8 _3 x2 D4 M5.數值範圍7 Z* E: l# K+ x/ j
因為定點數是有限的位元組成,也是有限的數字集合及有限的可使用範圍,一但超過範圍的數也無法表示。也就是在運算上有可能會產生縊位問題,而造成非預期結果。
G1 f* ^8 T6 q# ^$ K( f所以只可以使用在變動不大的運算上。所以要考量使用的數值範圍及使用精度,這方面是定點數在使用前要考量好的。
/ p% d! y6 @- W9 s1 A. i定點數應用例:' _$ r' G! z. i( B' g' u V# q
已知機器運算只能使用整數的狀況下,要使用小數,則是使用負的S指數,將尾數變成整數。尾數送入機器去運算;指數則是人工管理。
8 |0 x7 \- k- E- l例:r=10.1求圓面積area,假設輸出入需求精度為0.1, o$ ~/ Y2 ^0 v& A9 c& G: a' ^
解答:精度為0.1則,log(0.1)/log(2)=-3.32,故選用的S指數要到S-4可以達成。2 p9 X- N( w; z( R6 a, L; ~
pi=3.1416=50S-4(四捨五入)( `6 {* b1 H% h" R
r=10.1=162S-4(四捨五入)
& X- z5 O& \" }2 W: a; _area=pi*r*r=50S-4*162S-4*162S-4=1312200S-12=5126S-4(四捨五入)
& A( V f% A9 ^ I1 T* s: z換算為320.375
+ r) O# P, E9 \8 C0 [ y' ^實際為320.47386659269480825557425152834
! m7 d* ~- H4 }3 C" h+ o5 v只有精準到整數,是因為所有數值精確度只有到0.1,誤差是0.05,運算來源有三個,故最大誤差為0.15,所以符合誤差範圍。6 f4 c3 H! a1 k
由算式可以得知機器只計算50*162*162,解讀結果需右移8位元含四捨五入,輸出結果為S-4格式。
; ^* k e* J* B- L& S$ Y8 x5 Z: j小技巧:) \* ], X& x: m/ s. M7 ?3 L
定點數之計算可以使用小算盤來算。將小算盤設定為工程型。使用二進位顯示就可以將十進位轉成二進位。
$ ~- N6 b) [2 C! @& V因二進位只能使用整數,所以要先轉成整數才可以顯示。
- S( y' G2 D# H: n2 T例如:pi的取用。* L: r# D4 \. N3 Q- [8 y
pi取S-4結果為何?先取出pi=3.1415926535897932384626433832795& H6 _" x' F1 P+ Y5 T
若我們使用精度為Qword則有64位元可以用,可以先乘上2^32,取用4相關的指數,可以在顯示時容易找到小數點位置。+ x2 g+ h8 F! b0 Y# ?0 D6 m
結果為13493037704.522018958598982648896
+ Z, X* g! ], J/ O* B' O {/ T7 {直接按二進位,結果為11 0010 0100 0011 1111 0110 1010 1000 1000
0 v- r/ q9 V/ u+ S找到小數點位置後可以發現是110010bS-4
* v2 O9 P4 r. h% r, e: T輸入110010按十進位可得50,我們可知pi=50S-4- }+ F" P6 }* z( T$ P8 L9 p1 e
另外pi常有人用201/64來表示,其實是使用S-6的格式,可以看上面的值找出pi=11001001bS-6=201S-6
1 _4 T* I% G/ y8 K o另外四捨五入在二進位很容易做,只要看取需要取用的小數精度下一位是否為1,若是則結果加一,不是則捨棄。7 A% `4 h% q3 @/ a
但會引發另一問題,剛好尾數LSB為多個1連續,則會進位。
& P6 x$ n: a' p$ y6 ]. C以pi為例取S-10至S-15四捨五入後表示的數皆相同,都會和S-10完全一樣,精度沒有增加,pi皆為3217S-10,就算是寫成不同的S值,如12868S-12,仍等於3217S-10。 |
|