|
2#
樓主 |
發表於 2008-1-19 20:57:07
|
只看該作者
主題:定點數小數表示法, q) U8 @2 L" z. _& l
使用範圍:使用整數運算系統下之小數運算. a% q' X) p( \" }. ~
參考資料:嵌入式系統構件 Jean J. Labrosse原著 黃文增譯 全華科技圖書出版
5 u! L% S* @! I4 G- E原理說明:( Q# F% I. F8 c6 t
先復習一下計算機概論,有許多人都還給老師了。"^"表示次方運算
1 p" ?5 v) H3 c- F1 B4 R101.101b=2^3+2^0+2^-1+2^-3=5.625
! i) b w' j0 c7 o" _現在是如何運用到FPGA上了。其實這個問題在之前的定點數DSP就遇過了,只是後來應用變少了。現在的FPGA又要用,捲土重來。
$ T6 [3 c! G& G q2 f4 ^" K我們知道FPGA對於整數系統的加減法是可以,但是遇到小數有些人就不知該如何。其實不難,只要在整數運算系統上加上小數點就行了。4 Y* z: o9 i/ p7 r
例如101.1b+101.1b=1011.0b,可以發現去掉小數點就和整數運算沒有兩樣。意指,只要將小數點那個位數對齊就可以了,使用移位對FPGA是很容易的。) P. t1 q4 l; Z* m" m! ?, S
但是整數運算使用為小數要標示小數位置,所以引入類似科學記號表示法。我們知道科學表示法為<尾數>E<指數>,例:3E3=3*10^3=3000,E表示10的次方。
# H+ M# k* ~+ w# w3 M定點數的表示法符號為S,表示法為<尾數>S<指數>,S表示為2的次方。舉例2.5S3=2.5*2^3=2.5*8=20。, I% N. Z, T u
在基本數學運算下的處理為:
% e, t$ C4 a( A( J1.加減法
: ]+ z3 G% S; N( t4 u處理方式是將小數位數對齊再做運算。例:2S3+3S2=20S2+3S2=23S2
. t6 D8 p, j6 _; R2 G2.乘除法- b! z9 }! a% o( W# u5 x4 ? \) ]
乘法時要將指數相加,尾數相乘。例:2S3*3S2=6S5
: f5 C9 a- A# f5 \除法時要將指數相減,尾數相除。例:2S3/3S2=0.66S1. T8 o0 l& r- z, g; V" a; e! Z% r( P
3.開根3 v+ y5 \2 E! a% J
主要是推導數學運算對指數的影響。9 ~8 P l* d; U! s q+ i
sqrt(aSb)=sqrt(a)*sqrt(2^b)=sqrt(a)*2^(b/2)
2 h+ ?5 I- e9 D可以發現在開根時指數是除2,尾數直接開根。
6 Q$ D$ B' }. n, s4.小數精度的選用* G* O! x. z0 n2 N
為了符合精度,要如何選用指數範圍。我們使用定點數其精度取決於二進位小數取多少位。
" S& J- N) M% P$ M# ^例如若是使用S-4為其指數,每二數之間最小距離為2^-4=0.0625。此為S-4下的精度。2 @/ J. I2 g2 F2 Z7 \- V$ j
對應十進位精度可以使用log(精度)/log(2)去計算要使用的指數。0 J% N/ r8 I* n5 B" Y$ @
使用精度0.1則S取用為log(0.1)/log(2)=-3.32,則使用S-4為其數值格式,就夠用了。* z! C3 Q: _9 k# }
5.數值範圍
6 I5 t$ r. ]6 ?5 Z因為定點數是有限的位元組成,也是有限的數字集合及有限的可使用範圍,一但超過範圍的數也無法表示。也就是在運算上有可能會產生縊位問題,而造成非預期結果。
Y$ ^ E% R/ D, u所以只可以使用在變動不大的運算上。所以要考量使用的數值範圍及使用精度,這方面是定點數在使用前要考量好的。$ E+ w# o) z) g5 B/ I$ _
定點數應用例:
5 C- [' _1 H4 l已知機器運算只能使用整數的狀況下,要使用小數,則是使用負的S指數,將尾數變成整數。尾數送入機器去運算;指數則是人工管理。
5 s7 A" y: U! A4 l$ m例:r=10.1求圓面積area,假設輸出入需求精度為0.19 S0 H8 n$ c# E
解答:精度為0.1則,log(0.1)/log(2)=-3.32,故選用的S指數要到S-4可以達成。* U/ [; Y4 x6 W z! B
pi=3.1416=50S-4(四捨五入)
& N5 r4 t% t- ]4 Zr=10.1=162S-4(四捨五入)
9 D. M/ H1 S! I/ o* q- yarea=pi*r*r=50S-4*162S-4*162S-4=1312200S-12=5126S-4(四捨五入). _: p; L L7 r( Y
換算為320.3755 J( C' `2 `! [& ?7 i) O
實際為320.47386659269480825557425152834' S4 P4 \4 m3 j- v" p
只有精準到整數,是因為所有數值精確度只有到0.1,誤差是0.05,運算來源有三個,故最大誤差為0.15,所以符合誤差範圍。
8 F. S- A* w: z6 I/ Q- M8 z( p由算式可以得知機器只計算50*162*162,解讀結果需右移8位元含四捨五入,輸出結果為S-4格式。# g2 a2 a6 A7 z% i% u- Y' d0 W! I
小技巧:9 N4 ]% `' b( q( k. h
定點數之計算可以使用小算盤來算。將小算盤設定為工程型。使用二進位顯示就可以將十進位轉成二進位。
' j3 F3 B* S4 X8 L- J9 r因二進位只能使用整數,所以要先轉成整數才可以顯示。3 J5 V/ e! K S; _: S4 f
例如:pi的取用。$ k! L. [# W: u% \
pi取S-4結果為何?先取出pi=3.1415926535897932384626433832795
! \0 W# k* \- [; F7 M5 \# }; d, ^若我們使用精度為Qword則有64位元可以用,可以先乘上2^32,取用4相關的指數,可以在顯示時容易找到小數點位置。9 ^! x6 n& N2 i# n9 q6 o
結果為13493037704.522018958598982648896
% V2 z4 X3 e4 O6 v# {4 H直接按二進位,結果為11 0010 0100 0011 1111 0110 1010 1000 1000
) _: F+ w( W6 g& J- N: B找到小數點位置後可以發現是110010bS-4 }+ ]* K5 x4 }
輸入110010按十進位可得50,我們可知pi=50S-4
! l9 H. J1 t- ]7 M( I另外pi常有人用201/64來表示,其實是使用S-6的格式,可以看上面的值找出pi=11001001bS-6=201S-6
8 w/ C# K) L( M3 q- f另外四捨五入在二進位很容易做,只要看取需要取用的小數精度下一位是否為1,若是則結果加一,不是則捨棄。$ Z( o6 {( q6 x+ I
但會引發另一問題,剛好尾數LSB為多個1連續,則會進位。
) Z+ m9 ]% m2 E: B0 C2 @/ ~! P. E以pi為例取S-10至S-15四捨五入後表示的數皆相同,都會和S-10完全一樣,精度沒有增加,pi皆為3217S-10,就算是寫成不同的S值,如12868S-12,仍等於3217S-10。 |
|