0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

一文了解FPGA浮點小數(shù)與定點小數(shù)的換算及應用

Hx ? 作者:工程師陳翠 ? 2018-06-28 15:49 ? 次閱讀

定點小數(shù)運算

有些FPGA中是不能直接對浮點數(shù)進行操作的,只能采用定點數(shù)進行數(shù)值運算。

所謂定點小數(shù)就是把小數(shù)點的位置固定,我們要用整數(shù)來表示小數(shù)。

先以10進制為例。如果我們能夠計算12+34=46的話,當然也就能夠計算1.2+3.4 或者 0.12+0.34了。所以定點小數(shù)的加減法和整數(shù)的相同,并且和小數(shù)點的位置無關。乘法就不同了。 12*34=408,而1.2*3.4=4.08。這里1.2的小數(shù)點在第1位之前,而4.08的小數(shù)點在第2位之前,小數(shù)點發(fā)生了移動。所以在做乘法的時候,需要對小數(shù)點的位置進行調(diào)整?!可是既然我們是做定點小數(shù)運算,那就說小數(shù)點的位置不能動!!怎么解決這個矛盾呢,那就是舍棄最低位。

也就說1.2*3.4=4.1,這樣我們就得到正確的定點運算的結(jié)果了。所以在做定點小數(shù)運算的時候不僅需要牢記小數(shù)點的位置,還需要記住表達定點小數(shù)的有效位數(shù)。上面這個例子中,有效位數(shù)為2,小數(shù)點之后有一位。

現(xiàn)在進入二進制。我們的定點小數(shù)用16位二進制表達,最高位是符號位,那么有效位就是15位。小數(shù)點之后可以有0 - 15位。我們把小數(shù)點之后有n位叫做Qn,例如小數(shù)點之后有12位叫做Q12格式的定點小數(shù),而Q0就是我們所說的整數(shù)。

Q12的正數(shù)的最大值是 0 111 。 111111111111,第一個0是符號位,后面的數(shù)都是1,那么這個數(shù)是十進制的多少呢,很好運算,就是 0x7fff / 2^12 = 7.999755859375。對于Qn格式的定點小數(shù)的表達的數(shù)值就它的整數(shù)值除以2^n。在計算機中還是以整數(shù)來運算,我們把它想象成實際所表達的值的時候,進行這個運算。

反過來把一個實際所要表達的值x轉(zhuǎn)換Qn型的定點小數(shù)的時候,就是x*2^n了。例如 0.2的Q12型定點小數(shù)為:0.2*2^12 = 819.2,由于這個數(shù)要用整數(shù)儲存, 所以是819 即 0x0333。因為舍棄了小數(shù)部分,所以0x0333不是精確的0.2,實際上它是819/2^12 =0.199951171875。

我們用數(shù)學表達式做一下總結(jié):

x表示實際的數(shù)(*一個浮點數(shù)), q表示它的Qn型定點小數(shù)(一個整數(shù))。

q = (int) (x * 2^n)

x = (float)q/2^n

驗證:

由于/ 2^n和* 2^n可以簡單的用移位來計算,所以定點小數(shù)的運算比浮點小數(shù)要快得多。下面我們用一個例子來驗證一下上面的公式:

用Q12來計算2.1 * 2.2,先把2.1 2.2轉(zhuǎn)換為Q12定點小數(shù):

2.1 * 2^12 = 8601.6 = 8602

2.2 * 2^12 = 9011.2 = 9011

(8602 * 9011) 》》 12 = 18923

18923的實際值是18923/2^12 = 4.619873046875 和實際的結(jié)果 4.62相差0.000126953125,對于一般的計算已經(jīng)足夠精確了。

小數(shù)的定標精度、范圍

采用定點數(shù)進行數(shù)值運算,其操作數(shù)一般采用整型數(shù)來表示。一個整型數(shù)的最大表示范圍取決于DSP芯片所給定的字長,一般為16位或24位。顯然,字長越長,所能表示的數(shù)的范圍越大,精度也越高。

對于FPGA而言,F(xiàn)PGA對小數(shù)是無能為力的,一種解決方法是采用定標,就是將運算的浮點數(shù)擴大很多倍,然后取整,再用這個數(shù)進行運算,運算結(jié)束后再縮小相應的倍數(shù)。

通過設定小數(shù)點在16位數(shù)中的不同位置,就可以表示不同大小和不同精度的小數(shù)了。數(shù)的定標有Q表示法和S表示法兩種。表1.1列出了一個16位數(shù)的16種Q表示、S表示及它們所能表示的十進制數(shù)值范圍。

同樣一個16位數(shù),若小數(shù)點設定的位置不同,它所表示的數(shù)也就不同。例如:

16進制數(shù)2000H=8192,用Q0表示

16進制數(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。因此,對定點數(shù)而言,數(shù)值范圍與精度是一對矛盾,一個變量要想能夠表示比較大的數(shù)值范圍,必須以犧牲精度為代價;而想精度提高,則數(shù)的表示范圍就相應地減小。在實際的定點算法中,為了達到最佳的性能,必須充分考慮到這一點。

浮點數(shù)與定點數(shù)的轉(zhuǎn)換關系可表示為:

浮點數(shù)(x)轉(zhuǎn)換為定點數(shù)(xq):xq=(int)x* 2^Q

定點數(shù)(xq)轉(zhuǎn)換為浮點數(shù)(x):x=(float)xq*2^(-Q)

例如,浮點數(shù)x=0.5,定標Q=15,則定點數(shù)xq=L0.5*32768J=16384,式中LJ表示下取整。反之,一個用Q=15表示的定點數(shù)16384,其浮點數(shù)為16384*2-15=16384/32768=0.5。浮點數(shù)轉(zhuǎn)換為定點數(shù)時,為了降低截尾誤差,在取整前可以先加上0.5。

Q和S表示方法,如下表所示。

Q表示 S表示 十進制表示范圍

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ù)定點數(shù),需要自己去定點,比如用16位,就可以分成8位整數(shù)和8位小數(shù),即(8,8),即“定點”在第8位。那么:

1 -》 16‘h0100

1.5 -》 16’h0180

-1.5 -》 -1.5*256 + 65536(補碼) -》 16‘hFE80

1.164 -》 1.164*256 = 298 = 16’h012A

如果兩個小數(shù)相乘,即表示定點數(shù)相乘,比如,Q15表示的4000H(浮點數(shù)0.5)乘以Q15表示的4000H,4000H×4000H=1000 0000H,那么乘完之后的Q值為15+15=30.即浮點數(shù)表示0.25.

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • FPGA
    +關注

    關注

    1625

    文章

    21620

    瀏覽量

    601232
收藏 人收藏

    評論

    相關推薦

    小數(shù)在內(nèi)存中是如何存儲的?為什么C語言中的浮點數(shù)不支持位移操作?

    小數(shù)在內(nèi)存中是如何存儲的?為什么C語言中的浮點數(shù)不支持位移操作?
    發(fā)表于 08-16 09:24 ?981次閱讀
    <b class='flag-5'>小數(shù)</b>在內(nèi)存中是如何存儲的?為什么C語言中的<b class='flag-5'>浮點</b>數(shù)不支持位移操作?

    第7章 DSP定點數(shù)和浮點數(shù)

    轉(zhuǎn)dsp系列教程本期教程主要跟大家講解一下定點數(shù)和浮點數(shù)的基礎知識,了解這些基礎知識對于后面學習ARM官方的DSP庫大有裨益。特別是初學的定要理解這些基礎知識。 7.1
    發(fā)表于 09-22 13:02

    基于牛頓迭代法的FPGA定點小數(shù)計算

    倒數(shù)算法的HDL實現(xiàn),只需要進行次到兩次迭代便可獲得相對精確的結(jié)果。在些實時圖像處理場合中,對算法的運算速度和Latency要求較高,因此可以采用定點小數(shù)適當?shù)亟档途纫垣@得更高的
    發(fā)表于 07-18 07:33

    LABVIEW 保留小數(shù)精度與進制換算

    LABVIEW 保留小數(shù)精度與進制換算
    發(fā)表于 05-14 18:55

    定點小數(shù)的表示方法

    定點小數(shù)的表示方法   定點小數(shù),是指小數(shù)點準確固定在數(shù)據(jù)某個位置上的小數(shù),從實用角度看,都把
    發(fā)表于 10-13 17:12 ?8180次閱讀

    定點小數(shù)的編碼方法

    定點小數(shù)的編碼方法  用定點小數(shù)引出數(shù)值的三種編碼(原碼、補碼和反碼)方法是最方便的。   (1) 原碼表示法,是用機器數(shù)的最高位代表
    發(fā)表于 10-13 17:19 ?3312次閱讀
    <b class='flag-5'>定點</b><b class='flag-5'>小數(shù)</b>的編碼方法

    LM4F定點格式于浮點格式的對比和浮點運算的應用詳細中文資料

    定點數(shù)指小數(shù)點在數(shù)中的位置是固定不變的,通常有定點整數(shù)和定點小數(shù)。在對小數(shù)點位置作出選擇之后,運
    發(fā)表于 05-09 11:40 ?11次下載
    LM4F<b class='flag-5'>定點</b>格式于<b class='flag-5'>浮點</b>格式的對比和<b class='flag-5'>浮點</b>運算的應用詳細中文資料

    FPGA定點小數(shù)的常規(guī)格式、相對于浮點小數(shù)的優(yōu)勢與劣勢和計算的概述

    所謂定點小數(shù),就是小數(shù)點固定地隱含在某位置上的數(shù)據(jù)。由于小數(shù)點的位置是固定的,所以就沒有必要儲存它(如果儲存了
    的頭像 發(fā)表于 06-12 19:34 ?9430次閱讀
    <b class='flag-5'>FPGA</b><b class='flag-5'>定點</b><b class='flag-5'>小數(shù)</b>的常規(guī)格式、相對于<b class='flag-5'>浮點</b><b class='flag-5'>小數(shù)</b>的優(yōu)勢與劣勢和計算的概述

    FOC之定點小數(shù)運算

    許多MCU 芯片只支持整數(shù)運算,如果要在這些芯片上進行小數(shù)運算,定點運算應該是最佳選擇了;此外即使芯片支持浮點數(shù),定點小數(shù)運算也是最佳的速度
    的頭像 發(fā)表于 07-11 15:10 ?6340次閱讀
    FOC之<b class='flag-5'>定點</b><b class='flag-5'>小數(shù)</b>運算

    FPGA浮點數(shù)轉(zhuǎn)化為定點數(shù)方法

    FPGA在常規(guī)運算時不能進行浮點運算,只能進行定點整型運算,在處理數(shù)據(jù)的小數(shù)乘加運算和除法運算時FPGA
    的頭像 發(fā)表于 10-13 16:23 ?4636次閱讀

    浮點定點運算以及數(shù)據(jù)定標和精度問題

    計算機體系結(jié)構(gòu)中浮點定點數(shù)據(jù)的表示 1、定點數(shù): 定點數(shù)指小數(shù)點在數(shù)中的位置是固定不變的,通常有定點
    的頭像 發(fā)表于 12-06 10:00 ?4568次閱讀

    python小數(shù)數(shù)字對象Decimal

    python的小數(shù)數(shù)字對象,類似于浮點數(shù),只不過小數(shù)數(shù)字有固定的位數(shù)和小數(shù)點。 python小數(shù)數(shù)字是有固定精度的
    的頭像 發(fā)表于 03-10 10:04 ?661次閱讀

    FPGA定點數(shù)截位的基本準則

    FPGA內(nèi)部表示正負數(shù),小數(shù)的規(guī)則。兩者相比之下,定點數(shù)實現(xiàn)簡單,表達更為直觀,所以在很多時候FPGA通常使用定點數(shù)表示
    發(fā)表于 06-19 10:44 ?1407次閱讀
    <b class='flag-5'>FPGA</b><b class='flag-5'>定點</b>數(shù)截位的基本準則

    定點數(shù)和浮點數(shù)的概念 浮點數(shù)二進制序列與指數(shù)表達式之間的轉(zhuǎn)化

    數(shù)的缺點:由于小數(shù)點位置固定不變,定點數(shù)所表示的數(shù)的范圍非常有限,不能同時表達特別大或特別小的數(shù),所以才出現(xiàn)了浮點數(shù),以此來擴充數(shù)的范圍,同時浮點數(shù)也廣泛應用于精度要求高的場合。簡單的
    的頭像 發(fā)表于 08-22 16:06 ?7603次閱讀
    <b class='flag-5'>定點</b>數(shù)和<b class='flag-5'>浮點</b>數(shù)的概念 <b class='flag-5'>浮點</b>數(shù)二進制序列與指數(shù)表達式之間的轉(zhuǎn)化

    python如何保留小數(shù)

    對Python中的小數(shù)處理有更深入的理解。 引言: 在計算機編程中,浮點數(shù)是種最常用的數(shù)據(jù)類型,用于表示實數(shù)。然而,由于計算機的內(nèi)部存儲方式以及浮點數(shù)的特性,導致
    的頭像 發(fā)表于 11-23 16:37 ?1843次閱讀