定點(diǎn)小數(shù)運(yùn)算
有些FPGA中是不能直接對(duì)浮點(diǎn)數(shù)進(jìn)行操作的,只能采用定點(diǎn)數(shù)進(jìn)行數(shù)值運(yùn)算。
所謂定點(diǎn)小數(shù)就是把小數(shù)點(diǎn)的位置固定,我們要用整數(shù)來表示小數(shù)。
先以10進(jìn)制為例。如果我們能夠計(jì)算12+34=46的話,當(dāng)然也就能夠計(jì)算1.2+3.4 或者 0.12+0.34了。所以定點(diǎn)小數(shù)的加減法和整數(shù)的相同,并且和小數(shù)點(diǎn)的位置無關(guān)。乘法就不同了。 12*34=408,而1.2*3.4=4.08。這里1.2的小數(shù)點(diǎn)在第1位之前,而4.08的小數(shù)點(diǎn)在第2位之前,小數(shù)點(diǎn)發(fā)生了移動(dòng)。所以在做乘法的時(shí)候,需要對(duì)小數(shù)點(diǎn)的位置進(jìn)行調(diào)整?!可是既然我們是做定點(diǎn)小數(shù)運(yùn)算,那就說小數(shù)點(diǎn)的位置不能動(dòng)!!怎么解決這個(gè)矛盾呢,那就是舍棄最低位。
也就說1.2*3.4=4.1,這樣我們就得到正確的定點(diǎn)運(yùn)算的結(jié)果了。所以在做定點(diǎn)小數(shù)運(yùn)算的時(shí)候不僅需要牢記小數(shù)點(diǎn)的位置,還需要記住表達(dá)定點(diǎn)小數(shù)的有效位數(shù)。上面這個(gè)例子中,有效位數(shù)為2,小數(shù)點(diǎn)之后有一位。
現(xiàn)在進(jìn)入二進(jìn)制。我們的定點(diǎn)小數(shù)用16位二進(jìn)制表達(dá),最高位是符號(hào)位,那么有效位就是15位。小數(shù)點(diǎn)之后可以有0 - 15位。我們把小數(shù)點(diǎn)之后有n位叫做Qn,例如小數(shù)點(diǎn)之后有12位叫做Q12格式的定點(diǎn)小數(shù),而Q0就是我們所說的整數(shù)。
Q12的正數(shù)的最大值是 0 111 。 111111111111,第一個(gè)0是符號(hào)位,后面的數(shù)都是1,那么這個(gè)數(shù)是十進(jìn)制的多少呢,很好運(yùn)算,就是 0x7fff / 2^12 = 7.999755859375。對(duì)于Qn格式的定點(diǎn)小數(shù)的表達(dá)的數(shù)值就它的整數(shù)值除以2^n。在計(jì)算機(jī)中還是以整數(shù)來運(yùn)算,我們把它想象成實(shí)際所表達(dá)的值的時(shí)候,進(jìn)行這個(gè)運(yùn)算。
反過來把一個(gè)實(shí)際所要表達(dá)的值x轉(zhuǎn)換Qn型的定點(diǎn)小數(shù)的時(shí)候,就是x*2^n了。例如 0.2的Q12型定點(diǎn)小數(shù)為:0.2*2^12 = 819.2,由于這個(gè)數(shù)要用整數(shù)儲(chǔ)存, 所以是819 即 0x0333。因?yàn)樯釛壛诵?shù)部分,所以0x0333不是精確的0.2,實(shí)際上它是819/2^12 =0.199951171875。
我們用數(shù)學(xué)表達(dá)式做一下總結(jié):
x表示實(shí)際的數(shù)(*一個(gè)浮點(diǎn)數(shù)), q表示它的Qn型定點(diǎn)小數(shù)(一個(gè)整數(shù))。
q = (int) (x * 2^n)
x = (float)q/2^n
驗(yàn)證:
由于/ 2^n和* 2^n可以簡(jiǎn)單的用移位來計(jì)算,所以定點(diǎn)小數(shù)的運(yùn)算比浮點(diǎn)小數(shù)要快得多。下面我們用一個(gè)例子來驗(yàn)證一下上面的公式:
用Q12來計(jì)算2.1 * 2.2,先把2.1 2.2轉(zhuǎn)換為Q12定點(diǎn)小數(shù):
2.1 * 2^12 = 8601.6 = 8602
2.2 * 2^12 = 9011.2 = 9011
(8602 * 9011) 》》 12 = 18923
18923的實(shí)際值是18923/2^12 = 4.619873046875 和實(shí)際的結(jié)果 4.62相差0.000126953125,對(duì)于一般的計(jì)算已經(jīng)足夠精確了。
小數(shù)的定標(biāo)精度、范圍
采用定點(diǎn)數(shù)進(jìn)行數(shù)值運(yùn)算,其操作數(shù)一般采用整型數(shù)來表示。一個(gè)整型數(shù)的最大表示范圍取決于DSP芯片所給定的字長(zhǎng),一般為16位或24位。顯然,字長(zhǎng)越長(zhǎng),所能表示的數(shù)的范圍越大,精度也越高。
對(duì)于FPGA而言,F(xiàn)PGA對(duì)小數(shù)是無能為力的,一種解決方法是采用定標(biāo),就是將運(yùn)算的浮點(diǎn)數(shù)擴(kuò)大很多倍,然后取整,再用這個(gè)數(shù)進(jìn)行運(yùn)算,運(yùn)算結(jié)束后再縮小相應(yīng)的倍數(shù)。
通過設(shè)定小數(shù)點(diǎn)在16位數(shù)中的不同位置,就可以表示不同大小和不同精度的小數(shù)了。數(shù)的定標(biāo)有Q表示法和S表示法兩種。表1.1列出了一個(gè)16位數(shù)的16種Q表示、S表示及它們所能表示的十進(jìn)制數(shù)值范圍。
同樣一個(gè)16位數(shù),若小數(shù)點(diǎn)設(shè)定的位置不同,它所表示的數(shù)也就不同。例如:
16進(jìn)制數(shù)2000H=8192,用Q0表示
16進(jìn)制數(shù)2000H=0.25,用Q15表示
不同的Q所表示的數(shù)不僅范圍不同,而且精度也不相同。Q越大,數(shù)值范圍越小,但精度越高;相反,Q越小,數(shù)值范圍越大,但精度就越低。
例如,Q0 的數(shù)值范圍是一32768到+32767,其精度為1,而Q15的數(shù)值范圍為-1到0.9999695,精度為1/32768=0.00003051。因此,對(duì)定點(diǎn)數(shù)而言,數(shù)值范圍與精度是一對(duì)矛盾,一個(gè)變量要想能夠表示比較大的數(shù)值范圍,必須以犧牲精度為代價(jià);而想精度提高,則數(shù)的表示范圍就相應(yīng)地減小。在實(shí)際的定點(diǎn)算法中,為了達(dá)到最佳的性能,必須充分考慮到這一點(diǎn)。
浮點(diǎn)數(shù)與定點(diǎn)數(shù)的轉(zhuǎn)換關(guān)系可表示為:
浮點(diǎn)數(shù)(x)轉(zhuǎn)換為定點(diǎn)數(shù)(xq):xq=(int)x* 2^Q
定點(diǎn)數(shù)(xq)轉(zhuǎn)換為浮點(diǎn)數(shù)(x):x=(float)xq*2^(-Q)
例如,浮點(diǎn)數(shù)x=0.5,定標(biāo)Q=15,則定點(diǎn)數(shù)xq=L0.5*32768J=16384,式中LJ表示下取整。反之,一個(gè)用Q=15表示的定點(diǎn)數(shù)16384,其浮點(diǎn)數(shù)為16384*2-15=16384/32768=0.5。浮點(diǎn)數(shù)轉(zhuǎn)換為定點(diǎn)數(shù)時(shí),為了降低截尾誤差,在取整前可以先加上0.5。
Q和S表示方法,如下表所示。
Q表示 S表示 十進(jìn)制表示范圍
Q15 S0.15 -1≤x≤0.9999695
Q14 S1.14 -2≤x≤1.9999390
Q13 S2.13 -4≤x≤3.9998779
Q12 S3.12 -8≤x≤7.9997559
Q11 S4.11 -16≤x≤15.9995117
Q10 S5.10 -32≤x≤31.9990234
Q9 S6.9 -64≤x≤63.9980469
Q8 S7.8 -128≤x≤127.9960938
Q7 S8.7 -256≤x≤255.9921875
Q6 S9.6 -512≤x≤511.9804375
Q5 S10.5 -1024≤x≤1023.96875
Q4 S11.4 -2048≤x≤2047.9375
Q3 S12.3 -4096≤x≤4095.875
Q2 S13.2 -8192≤x≤8191.75
Q1 S14.1 -16384≤x≤16383.5
Q0 S15.0 -32768≤x≤32767
一般在FPGA中處理小數(shù)定點(diǎn)數(shù),需要自己去定點(diǎn),比如用16位,就可以分成8位整數(shù)和8位小數(shù),即(8,8),即“定點(diǎn)”在第8位。那么:
1 -》 16‘h0100
1.5 -》 16’h0180
-1.5 -》 -1.5*256 + 65536(補(bǔ)碼) -》 16‘hFE80
1.164 -》 1.164*256 = 298 = 16’h012A
如果兩個(gè)小數(shù)相乘,即表示定點(diǎn)數(shù)相乘,比如,Q15表示的4000H(浮點(diǎn)數(shù)0.5)乘以Q15表示的4000H,4000H×4000H=1000 0000H,那么乘完之后的Q值為15+15=30.即浮點(diǎn)數(shù)表示0.25.
-
FPGA
+關(guān)注
關(guān)注
1626文章
21678瀏覽量
602031
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論