定点数的定标
轉(zhuǎn)自:http://blog.csdn.net/longxuekun1992/article/details/52895302
1. 選取合適的定標(biāo)值(加載操作數(shù))
定標(biāo)的大小,影響著整數(shù)部分和小數(shù)部分的位數(shù),定標(biāo)的過(guò)程其實(shí)是在操作數(shù)動(dòng)態(tài)范圍和精度之間做權(quán)衡的過(guò)程。
設(shè)一個(gè)變量可能出現(xiàn)的最大絕對(duì)值為|max|,n為正整數(shù),滿足2^(n-1) < |max| < 2^n,則定標(biāo)Q按如下規(guī)則選取最合適:
Q = 有效數(shù)據(jù)位 – n
對(duì)于32位的有符號(hào)數(shù),數(shù)據(jù)有效位=31。如|max| = 2.75,選Q = 31 – 2 =29是最合適的。
2. 定點(diǎn)數(shù)之間的運(yùn)算
兩個(gè)定點(diǎn)數(shù)進(jìn)行運(yùn)算,它們的定標(biāo)可能相同也可能不同,那該遵循怎樣的規(guī)則來(lái)進(jìn)行加減乘除等基本運(yùn)算呢?
網(wǎng)上有些資料通過(guò)分別舉加、減、乘、除實(shí)際運(yùn)算的例子來(lái)說(shuō)明這一問(wèn)題,雖然很詳細(xì),但還是不夠直觀。
來(lái)看一看,平時(shí)我們用十進(jìn)制做兩個(gè)數(shù)的加減和乘除是怎么弄的。
加減法:先對(duì)位,后加減;
乘除法:先乘除,后取小數(shù)點(diǎn)。
而定點(diǎn)數(shù)之間的加減乘除,撇開符號(hào)位不談,其過(guò)程是一樣一樣的:
加減法:先對(duì)標(biāo),后加減;
乘除法:先乘除,后定標(biāo)。
3. 結(jié)果重新定標(biāo)(返回結(jié)果)
兩個(gè)定點(diǎn)數(shù)運(yùn)算完成之后,所得結(jié)果的定標(biāo)、動(dòng)態(tài)范圍、精度要求等都可能發(fā)生了變化,因此可能需要進(jìn)行重新定標(biāo)。
比如Q15*Q15 -> Q30,但我們依然希望得到一個(gè)Q15的數(shù)怎么辦?其實(shí)只需做一個(gè)簡(jiǎn)單的右移15位操作就好,其它情況同理。
大家可以仔細(xì)體會(huì)下這里的意思,然后再找具體的例子對(duì)照感受下,看是不是覺(jué)得簡(jiǎn)單多了呢。
http://blog.csdn.net/times_poem/article/details/51505014
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ù)來(lái)運(yùn)算,我們把它想象成實(shí)際所表達(dá)的值的時(shí)候,進(jìn)行這個(gè)運(yùn)算。
反過(guò)來(lái)把一個(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
用Q12來(lái)計(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)足夠精確了。
http://www.eeworld.com.cn/DSP/2014/1025/article_4006.html
q = quantizer('fixed', 'ceil', 'saturate', [32 30]);
FixedNum=bin2dec(num2bin(q,1.999999999));
http://blog.163.com/xiada_action/blog/static/7423460220100255911247/
1.q = quantizer('fixed', 'ceil', 'saturate', [8 6]);imgbits=num2bin(q,k);這是將一個(gè)小數(shù)k,比如0.256 變成二進(jìn)制。小數(shù)點(diǎn)后面3位用6位二進(jìn)制表示。
現(xiàn)再將編出來(lái)的二進(jìn)制 恢復(fù)成10進(jìn)制 小數(shù):
二進(jìn)制小數(shù)轉(zhuǎn)換沒(méi)有現(xiàn)成的函數(shù),要自己編的。 或者你利用二進(jìn)制整數(shù)的轉(zhuǎn)換函數(shù)bin2dec() 比如二進(jìn)制的0.1101 那你就先把小數(shù)部分轉(zhuǎn)換成十進(jìn)制整數(shù) >> d=bin2dec('1101') d = 13 然后再根據(jù)位數(shù),小數(shù)點(diǎn)后面4位,就除以2^4 >> d/2^4 ans = 0.8125
2.寫文件:
fid=fopen('sin.coe','wt')
fprintf(fid, '%d',a)
fclose(fid)
讀取文件:
(1)fid1=fopen('fx.txt','r'); %得到文件號(hào)
[f,count]=fscanf(fid,'%f %f',[12,90])
%把文件號(hào)1的數(shù)據(jù)讀到f中。其中f是[12 90]的矩陣
%這里'%f %f'表示讀取數(shù)據(jù)的形勢(shì),他是按原始數(shù)據(jù)型讀出
fclose(fid);%關(guān)閉文件
(2) load data.txt
data
(3) a=importdata('data.txt')
總結(jié)
- 上一篇: 凹凸世界卡米尔资料图
- 下一篇: LOL瑞文未来战士皮肤技能特效观看