基于FPGA的數(shù)字信號(hào)處理--什么是定點(diǎn)數(shù)?
在實(shí)際的工程應(yīng)用中,往往會(huì)進(jìn)行大量的數(shù)學(xué)運(yùn)算。運(yùn)算時(shí)除了會(huì)用到整數(shù),很多時(shí)候也會(huì)用到小數(shù)。而我們知道在數(shù)字電路底層,只有「高電平1」和「低電平0」的存在,那么僅憑 0和1 該如何表示小數(shù)呢?
本文引用地址:http://butianyuan.cn/article/202405/458588.htm數(shù)字電路中,小數(shù)可以用兩種形式來(lái)表示:「定點(diǎn)數(shù)」和「浮點(diǎn)數(shù)」。浮點(diǎn)數(shù)的內(nèi)容我們下篇文章再講,本文只講定點(diǎn)數(shù)。
什么是定點(diǎn)數(shù)?
首先要明確的是,「定點(diǎn)數(shù)」的說(shuō)法是相對(duì)「浮點(diǎn)數(shù)」來(lái)說(shuō)的。要理解什么是定點(diǎn)數(shù),可以先從要理解它的名字開(kāi)始–定是什么?點(diǎn)又是什么?
「定點(diǎn)數(shù)」是英語(yǔ)「fixed-point number」的中文翻譯,fixed的意思是固定的,point的意思是小數(shù)點(diǎn),所以「定點(diǎn)數(shù)」其實(shí)也可以叫「固定小數(shù)點(diǎn)的數(shù)」。同樣的,「浮點(diǎn)數(shù)」自然就是「浮動(dòng)小數(shù)點(diǎn)的數(shù)」。
在10進(jìn)制中,小數(shù)的表示是通過(guò)小數(shù)點(diǎn)和它所在位置來(lái)實(shí)現(xiàn)的。比如12.5,它表示的值是十二點(diǎn)五;而1.25則是一點(diǎn)二五。盡管12.5和1.25都用了「1 2 5」這3個(gè)數(shù)來(lái)表示,但由于小數(shù)點(diǎn)位置的不同,使得前者的數(shù)值是后者的十倍。
遺憾的是,電路只能表示1和0,無(wú)法直接表示小數(shù)點(diǎn),所以上面的方法在電路中是行不通的。
假如你現(xiàn)在收到一條信息「我傳一個(gè)小數(shù)過(guò)來(lái),10100111」,看到這樣一條信息,你恐怕只會(huì)覺(jué)得莫名其妙!10100111是哪門子小數(shù)?慢著,10100111如果直接轉(zhuǎn)換成10進(jìn)制數(shù)就是167,167當(dāng)然不是小數(shù),因?yàn)樗鼪](méi)有小數(shù)點(diǎn)。但是仔細(xì)想想?它真的沒(méi)有小數(shù)點(diǎn)嗎?如果把167看做是167.0呢?也就是默認(rèn)它的小數(shù)點(diǎn)是在最右邊呢?
接著你很快又收到了第二條信息「我再傳一個(gè)小數(shù)過(guò)來(lái),10100111,它的小數(shù)點(diǎn)在從右往左數(shù)第1位」。這次你終于能看懂了 ,這不就是1010011.1嗎?也就是10進(jìn)制數(shù)83.5。那么直接說(shuō)83.5不就完事了嗎?說(shuō)這么多干嗎?
然后是第三條消息「我再傳一個(gè)小數(shù)過(guò)來(lái),10100111,它的小數(shù)點(diǎn)在從右往左數(shù)第2位」。這次傳的是101001.11,即10進(jìn)制數(shù)41.75。
······(省略后面的10086條消息)······
看到這是不是清晰很多了–盡管我們無(wú)法直接用小數(shù)點(diǎn)來(lái)表示2進(jìn)制小數(shù),但可以通過(guò)指定小數(shù)點(diǎn)的位置來(lái)說(shuō)明這是一個(gè)小數(shù)啊!
約定小數(shù)點(diǎn)的位置,且這個(gè)位置固定不變,小數(shù)點(diǎn)前、后的數(shù)字,分別用2進(jìn)制表示,組合起來(lái)就可以用來(lái)表示和使用2進(jìn)制小數(shù)了。用這種方式表示的數(shù)就叫做「定點(diǎn)數(shù)」。
定點(diǎn)數(shù)如何表示數(shù)字?
很容易想到,定點(diǎn)數(shù)除了能表示小數(shù)外,也可以表示整數(shù)。因?yàn)槟憧梢园研?shù)點(diǎn)的位置約定在最右面,這樣其實(shí)相當(dāng)于沒(méi)有小數(shù)點(diǎn),所以表示的都是整數(shù);同樣的,你也可以把小數(shù)點(diǎn)規(guī)定在最左邊,這樣表示的就是一個(gè)整數(shù)部分為0的小數(shù)。
所以定點(diǎn)數(shù)的表示可以分為三種情況:
純整數(shù)
這種情況約定小數(shù)點(diǎn)在最右邊。例如10進(jìn)制數(shù)85用8位無(wú)符號(hào)2進(jìn)制數(shù)表示就是0101_0101,因?yàn)樾?shù)點(diǎn)在最右邊,所以可以看做是0101_0101.0 。
純小數(shù)
定點(diǎn)純小數(shù)是指整數(shù)部分為0的小數(shù)。根據(jù)是無(wú)符號(hào)數(shù)還是有符號(hào)數(shù),分為兩種情況:
(1)無(wú)符號(hào)數(shù)
無(wú)符號(hào)數(shù)的最高位不表示符號(hào),僅表示數(shù)值。這種情況約定小數(shù)點(diǎn)的位置在最左邊。例如10進(jìn)制數(shù)0.125用8位無(wú)符號(hào)2進(jìn)制數(shù)表示就是0.0010_0000,因?yàn)樾?shù)點(diǎn)在最左邊,所以是0010_0000。
(2)有符號(hào)數(shù)
有符號(hào)數(shù)的最高位表示符號(hào),不表示數(shù)值。這種情況約定小數(shù)點(diǎn)的位置在次高位。例如10進(jìn)制數(shù)-0.125用8位無(wú)符號(hào)2進(jìn)制數(shù)表示就是1.0010_000,因?yàn)樾?shù)點(diǎn)在次高位,所以是1010_0000。
整數(shù) + 小數(shù)
除了純整數(shù)和純小數(shù)這兩種情況外,其實(shí)定點(diǎn)數(shù)主要是用來(lái)表示 「整數(shù) + 小數(shù)」的情況,例如3.14、1.5、25.125等等。這種情況需要確定以下信息才能正確表示該數(shù):
整數(shù)和小數(shù)的長(zhǎng)度之和確定了用多大的電路來(lái)表示定點(diǎn)數(shù),而二者的長(zhǎng)度之比則確定了小數(shù)點(diǎn)的位置。符號(hào)位則確定了該數(shù)是一個(gè)有符號(hào)數(shù)還是一個(gè)無(wú)符號(hào)數(shù)。
光說(shuō)不練云玩家,接下來(lái)看幾個(gè)例子。
(1)1.25 的定點(diǎn)數(shù)表示
首先約定用無(wú)符號(hào)數(shù)來(lái)表示,然后約定5 位為整數(shù)部分,3 位為小數(shù)部分。所以有:
1.25(D) = 1.01(B) = 00001.010 = 000010101
(2)-9.5 的定點(diǎn)數(shù)表示
首先需要用有符號(hào)數(shù)來(lái)表示,因?yàn)檎麛?shù)9需要4位來(lái)表示,而小數(shù)0.5僅需1位就可表示。為此可以約定5位為整數(shù)部分(注意最高位為符號(hào)位),3 位為小數(shù)部分。所以有:
-9.5(D) = 10110.1(B) = 10110.100 = 101101001
定點(diǎn)數(shù)的數(shù)值范圍
定點(diǎn)數(shù)用來(lái)表示小數(shù)很方便,但是它也有個(gè)很大的問(wèn)題–它的表示范圍很小。
以5 位表示整數(shù)部分,3 位表示小數(shù)部分的無(wú)符號(hào)定點(diǎn)數(shù)為例,它的整數(shù)部分可以表示的范圍是00000-11111,即0-31,步長(zhǎng)是1;小數(shù)部分的范圍是0.000-0.111,即0-0.875,步長(zhǎng)是0.125。綜合起來(lái)范圍是0-31.875,步長(zhǎng)為0.125。
有符號(hào)數(shù)的因?yàn)槭怯醚a(bǔ)碼表示,所以它的范圍取值比較特殊。以5 位表示整數(shù)部分,3 位表示小數(shù)部分的有符號(hào)定點(diǎn)數(shù)為例,它能表示的最小值是10000_000,即-32,它能表示的最大值是01111_111,即15.875。
若以m表示定點(diǎn)數(shù)的整數(shù)位寬(m不包含符號(hào)位),以n表示定點(diǎn)數(shù)的小數(shù)位寬,則有符號(hào)數(shù)和無(wú)符號(hào)數(shù)的定點(diǎn)數(shù)的表示范圍為:
有符號(hào)數(shù) | -2^m ~ (2^m - 2^-n) |
---|---|
無(wú)符號(hào)數(shù) | 0 ~ (2^m - 2^-n) |
如果想表示更大范圍、更高精度的值,怎么辦?
一些定點(diǎn)數(shù)的表示格式
除了可以用類似「以5 位表示整數(shù)部分,3 位表示小數(shù)部分的無(wú)符號(hào)定點(diǎn)數(shù)」的語(yǔ)言來(lái)描述定點(diǎn)數(shù)的格式外,還有多種定點(diǎn)數(shù)的表示格式。常見(jiàn)的有以下幾種:
Q格式(Q notation)
Q格式的一般形式是:
Qm.n
默認(rèn)情況下,用Q格式描述的都是有符號(hào)定點(diǎn)數(shù)。其中m表示整數(shù)部分的長(zhǎng)度(這個(gè)值不包括符號(hào)位),n表示小數(shù)部分的長(zhǎng)度。所以用Q格式描述的定點(diǎn)數(shù)的整體長(zhǎng)度為:
w = m + n + 1 //整數(shù)部分長(zhǎng)度 + 小數(shù)部分長(zhǎng)度 + 符號(hào)位長(zhǎng)度
例如 「 Q3.12 」描述的是一個(gè)整體長(zhǎng)度為16位的2進(jìn)制有符號(hào)定點(diǎn)數(shù),它的整數(shù)部分長(zhǎng)度是3,而小數(shù)部分長(zhǎng)度是12。根據(jù)小數(shù)部分的長(zhǎng)度,可以推斷出分辨率為 2^-12。
在Q前面加一個(gè) U 即可用來(lái)表示無(wú)符號(hào)的2進(jìn)制定點(diǎn)數(shù)。例如 「 UQ1.15」描述的就是一個(gè)整數(shù)部分長(zhǎng)度為1,小數(shù)部分長(zhǎng)度為15的無(wú)符號(hào)的2進(jìn)制定點(diǎn)數(shù)。
整數(shù)部分的長(zhǎng)度值和小數(shù)點(diǎn)可以被省略,而只描述小數(shù)部分的長(zhǎng)度。例如「 Q12 」描述的就是一個(gè)小數(shù)部分長(zhǎng)度是12的2進(jìn)制有符號(hào)定點(diǎn)數(shù),但是它的整體長(zhǎng)度是不確定的,你可以額外指定整體長(zhǎng)度,或者說(shuō)整體長(zhǎng)度就取決于存儲(chǔ)這個(gè)定點(diǎn)數(shù)的寄存器。
如果這個(gè)定點(diǎn)數(shù)存儲(chǔ)一個(gè)16位的寄存器,那它的值就是:
xxxx . xxxx_xxxx_xxxx
如果這個(gè)定點(diǎn)數(shù)存儲(chǔ)一個(gè)32位的寄存器,那它的值就是:
xxxx_xxxx_xxxx_xxxx_xxxx_xxxx . xxxx_xxxx_xxxx
其實(shí)也可以看出來(lái),這種表示方法就是把它的值乘以 2^-12 。
這種整數(shù)長(zhǎng)度m不包括符號(hào)位的Q格式主要是TI公司的DSP在使用,ARM公司也有一種類似的Q格式,但是它的整數(shù)長(zhǎng)度m是包含符號(hào)位的。表示方式的不同不是什么大不了的事,只要是使用過(guò)程中確定好了就行,為此你甚至也可以自己創(chuàng)造一套定點(diǎn)數(shù)表示方式(只要不怕沒(méi)人用就行,嘿嘿)。
S表示法
S表示法的一般形式是:
Sm.n
其中S表示這是一個(gè)有符號(hào)的定點(diǎn)數(shù),m表示整數(shù)位數(shù)(m不包括符號(hào)位),n表示小數(shù)位數(shù)。這種方法其實(shí)跟Q格式很像,只不過(guò)它的表示無(wú)符號(hào)定點(diǎn)數(shù)的方法不是在前面加 U ,而是去掉 S,像這樣:
m.n
例如「 2.4 」表示的就是一個(gè)整數(shù)位數(shù)為2,小數(shù)位數(shù)為4的無(wú)符號(hào)定點(diǎn)數(shù)。
總結(jié)
總的來(lái)說(shuō),用定點(diǎn)數(shù)表示的小數(shù),不僅數(shù)值的范圍表示有限,而且其精度也很低。要想解決這 2 個(gè)問(wèn)題,人們就提出了使用「浮點(diǎn)數(shù)」的方式表示數(shù)字,關(guān)于浮點(diǎn)數(shù)的表示方法,我們會(huì)在下一篇文章進(jìn)行講解。
定點(diǎn)數(shù)和浮點(diǎn)數(shù)都可以表示小數(shù),而定點(diǎn)數(shù)的精度固定,表現(xiàn)范圍比較有限;但是,定點(diǎn)數(shù)在硬件上比較容易實(shí)現(xiàn),在實(shí)際的數(shù)據(jù)算法中,定點(diǎn)數(shù)運(yùn)算效率比浮點(diǎn)數(shù)的運(yùn)算效率高很多,同時(shí)定點(diǎn)數(shù)使用的資源也比較少。因此,定點(diǎn)數(shù)被廣泛地應(yīng)用在數(shù)字信號(hào)處理的各種應(yīng)用場(chǎng)景中。
評(píng)論