浮點(diǎn)轉(zhuǎn)定點(diǎn)方法總結(jié)_第1頁(yè)
浮點(diǎn)轉(zhuǎn)定點(diǎn)方法總結(jié)_第2頁(yè)
浮點(diǎn)轉(zhuǎn)定點(diǎn)方法總結(jié)_第3頁(yè)
浮點(diǎn)轉(zhuǎn)定點(diǎn)方法總結(jié)_第4頁(yè)
浮點(diǎn)轉(zhuǎn)定點(diǎn)方法總結(jié)_第5頁(yè)
已閱讀5頁(yè),還剩14頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、浮點(diǎn)轉(zhuǎn)定點(diǎn)方法總結(jié)孔德琦目錄定點(diǎn)運(yùn)算方法31.1 數(shù) 的 定 標(biāo)31.2c語(yǔ)言:從浮點(diǎn)到定點(diǎn)41.2.1 加法4乘法6除法71.2.4 三角函數(shù)運(yùn)算81.2.5 開(kāi)方運(yùn)算91.3 附錄101.3.1 附錄1:定點(diǎn)函數(shù)庫(kù)10附錄2:正弦和余弦表28定點(diǎn)運(yùn)算方法1.1 數(shù) 的 定 標(biāo)對(duì)某些處理器而言,參與數(shù)值運(yùn)算的數(shù)就是16位的整型數(shù)。但在許多情況下,數(shù)學(xué)運(yùn)算過(guò)程中的數(shù)不一定都是整數(shù)。那么,如何處理小數(shù)的呢?應(yīng)該說(shuō),處理器本身無(wú)能為力。那么是不是就不能處理各種小數(shù)呢?當(dāng)然不是。這其中的關(guān)鍵就是由程序員來(lái)確定一個(gè)數(shù)的小數(shù)點(diǎn)處于16位中的哪一位。這就是數(shù)的定標(biāo)。通過(guò)設(shè)定小數(shù)點(diǎn)在16位數(shù)中的不同位置,就

2、可以表示不同大小和不同精度的小數(shù)了。數(shù)的定標(biāo)用Q表示法。表1.1列出了一個(gè)16位數(shù)的16種Q表示能表示的十進(jìn)制數(shù)值范圍和近似的精度。Q表示精度(近似)十進(jìn)制數(shù)表示范圍Q150.00002-1X0.9999695Q140.00005-2X1.9999390Q130.0001-4X3.9998779Q120.0002-8X7.9997559Q110.0005-16X15.9995117Q100.001-32X31.9990234Q90.002-64X63.9980469Q80.005-128X127.9960938Q70.01-256X255.9921875Q60.02-512X511.98043

3、75Q50.04-1024X1023.96875Q40.08-2048X2047.9375Q30.1-4096X4095.875Q20.25-8192X8191.75Q10.5-16384X16383.5Q01-32768X32767表1.1 Q表示、S表示及數(shù)值范圍從表1.1可以看出,同樣一個(gè)16位數(shù),若小數(shù)點(diǎn)設(shè)定的位置不同,它所表示的數(shù)也就不同。例如:16進(jìn)制數(shù)2000H8192,用Q0表示16進(jìn)制數(shù)2000H0.25,用Q15表示從表1.1還可以看出,不同的Q所表示的數(shù)不僅范圍不同,而且精度也不相同。Q越大,數(shù)值范圍越小,但精度越高;相反,Q越小,數(shù)值范圍越大,但精度就越低。例如,Q0的

4、數(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ù)():定點(diǎn)數(shù)()轉(zhuǎn)換為浮點(diǎn)數(shù)(x):例如,浮點(diǎn)數(shù) x=0.5,定標(biāo) Q15,則定點(diǎn)數(shù),式中表示下取整。反之,一個(gè)用 Q15 表示的定點(diǎn)數(shù)16384,其浮點(diǎn)數(shù)為163842-1516384

5、/32768=0.5。1.2 c語(yǔ)言:從浮點(diǎn)到定點(diǎn)下面所描述的幾種基本運(yùn)算是浮點(diǎn)到定點(diǎn)轉(zhuǎn)換中經(jīng)常遇到的,從中可以體會(huì)到一些基本的技巧和方法。1.2.1 加法設(shè)浮點(diǎn)加法運(yùn)算的表達(dá)式為:float x,y,z;z=x+y;將浮點(diǎn)加法/減法轉(zhuǎn)化為定點(diǎn)加法/減法時(shí)最重要的一點(diǎn)就是必須保證兩個(gè)操作數(shù)的定標(biāo)值一樣。若兩者不一樣,則在做加法/減法運(yùn)算前先進(jìn)行小數(shù)點(diǎn)的調(diào)整。為保證運(yùn)算精度,需使Q值小的數(shù)調(diào)整為與另一個(gè)數(shù)的Q值一樣大。此外,在做加法/減法運(yùn)算時(shí),必須注意結(jié)果可能會(huì)超過(guò)16位表示,即數(shù)的動(dòng)態(tài)范圍。如果加法/減法的結(jié)果超出16位的表示范圍,則必須保留32位結(jié)果,以保證運(yùn)算的精度。1 結(jié)果不超過(guò)16位

6、表示范圍設(shè)x的Q值為Qx,y的Q值為Qy,且QxQy,加法/減法結(jié)果z的定標(biāo)值為Qz,則zx+y = 一般情況,我們?nèi),y和z的定標(biāo)值相同,即Qx = Qy = Qz = Qa 。所以定點(diǎn)加法可以描述為: short x, y, z ; /Qa z = add (x,y); /Qa函數(shù)add ( ) 有防飽和機(jī)制,如果可以確信x + y 不會(huì)溢出(-215 = z = 215-1),可以直接寫(xiě)為 z = x + y .定點(diǎn)減法:short x, y, z ; /Qaz = sub (x,y); /Qa函數(shù)sub ( ) 有防飽和機(jī)制,如果可以確信x - y 不會(huì)溢出(-215 = z Qy,

7、加法結(jié)果z的定標(biāo)值為Qz,則定點(diǎn)加法為:int x,y;long temp,z;tempy(Qx-Qz),若QxQzztemp(Qz-Qx),若QxQz一般情況,我們?nèi),y和z的定標(biāo)值相同,即Qx = Qy = Qz = Qa 。所以定點(diǎn)加法可以描述為: int x, y, z ; /Qa z = L_add (x,y); /Qa函數(shù)L_add ( ) 有防飽和機(jī)制,如果可以確信x + y 不會(huì)溢出(-231 = z = 231-1),可以直接寫(xiě)為 z = x + y .定點(diǎn)減法: int x, y, z ; /Qa z = L_sub (x,y); /Qa函數(shù)L_sub ( ) 有防飽和機(jī)

8、制,如果可以確信x - y 不會(huì)溢出(-231 = z (Qx+Qy+1-Qz);上式中x乘y的定標(biāo)本來(lái)應(yīng)該是Qx + Qy, 但為了處理方便,函數(shù)L_mult( ) 多乘了一次2,因此要再加1。函數(shù)L_mult ( ) 有防飽和機(jī)制,如果可以確信z = x y 不會(huì)溢出(-231 = z (Qx+Qy-Qz)。2. 結(jié)果超過(guò)32位表示范圍這種情況下位數(shù)超出了標(biāo)準(zhǔn)c語(yǔ)言的數(shù)的表示范圍,只能用數(shù)組來(lái)保存變量。定點(diǎn)乘法可表示為:#define NN_DIGIT unsigned int NN_DIGIT x digits; NN_DIGIT y digits; NN_DIGIT z 2* digi

9、ts; NN_Mult (z, x, y, digits);應(yīng)注意的是以上32位乘法都是無(wú)符號(hào)數(shù)操作,如果需要做有符號(hào)數(shù)乘法,則需要根據(jù)乘數(shù)的符號(hào)來(lái)判斷。例1 設(shè)x = 18.4,y = 36.8,則浮點(diǎn)運(yùn)算值為z =18.436.8 = 677.12;設(shè) Qx = 10,Qy = 9,Qz = 5,所以int x = 18841;/Q10int y = 18841;/Q9z = L_mult(18841, 18841)(10+9+1-5) = 354983281L14 = 21666;因?yàn)閦的定標(biāo)值為5,故定點(diǎn) z = 21666即為浮點(diǎn)的 z = 21666/32 = 677.08。例2設(shè)

10、x = 18.4,y = 36.8,則浮點(diǎn)運(yùn)算值為z =18.436.8 = 677.12;#define NN_DIGIT unsigned int設(shè)Qx = 20, Qy = 20, Qy = 20, 所以NN_DIGIT x = 18.4 * (120); /Q20NN_DIGIT y = 36.8 * (120); /Q20NN_DIGIT z2; /Q20NN_Mult(z, &x, &y, 1); /Q40NN_Rshift(z, z, 20, 1); /Q(40-20)1.2.3除法1. 32位除法設(shè)浮點(diǎn)除法運(yùn)算的表達(dá)式為:float x,y,z;z = x/y;假設(shè)經(jīng)過(guò)統(tǒng)計(jì)后被

11、除數(shù)x的定標(biāo)值為Qx,除數(shù)y的定標(biāo)值為Qy,商z的定標(biāo)值為Qz,則z = x/y = 所以定點(diǎn)表示的除法為:int x,y,z;z = L_shl(x, (Qz-Qx+Qy) )/y; /Qz2. 32位以上的除法這種情況下位數(shù)超出了標(biāo)準(zhǔn)c語(yǔ)言的數(shù)的表示范圍,只能用數(shù)組來(lái)保存變量。#define NN_DIGIT unsigned intNN_DIGIT x 2*digits; /QxNN_DIGIT y digits; /QyNN_DIGIT z digits; /QzNN_Lshift(x, x, (Qz-Qx+Qy), 2);NN_Div(z, x, 2*digits, y, digit

12、s); 做以上運(yùn)算是要保證Qz-Qx+Qy 32, 否則要多次移位來(lái)實(shí)現(xiàn);應(yīng)注意的是以上除法都是無(wú)符號(hào)數(shù)操作,如果需要做有符號(hào)數(shù)除法,需要根據(jù)被除數(shù)和除數(shù)的符號(hào)來(lái)判斷。例 1: 設(shè)x = 18.4,y = 36.8,浮點(diǎn)運(yùn)算值為z = x/y = 18.4/36.8 = 0.5;根據(jù)上節(jié),得Qx = 10,Qy = 9,Qz = 15;所以有int x = 18841, y = 18841;z = L_shl(x, (15-10+9) )/18841; / 308690944L/18841 = 16384因?yàn)樯蘻的定標(biāo)值為15,所以定點(diǎn)z = 16384即為浮點(diǎn) z = 16384/215=

13、0.5。1.2.4 三角函數(shù)運(yùn)算1 正弦和余弦一般求cos、sin用查表法,方法是預(yù)先定義正弦和余弦表,表的長(zhǎng)度及表中各元素的定標(biāo)是根據(jù)精度要求確定的,精度要求越高,表的長(zhǎng)度及元素的定標(biāo)都可以增加。余弦表制作步驟:1) 計(jì)算cos(2*pi*t/N),其中0= t =N-1,N是02*pi之間的采樣點(diǎn)數(shù)。2) 將以上結(jié)果(浮點(diǎn)數(shù))按精度要求定標(biāo),如Q15, 3) 建立數(shù)組tab_cosN,將以上結(jié)果作為該數(shù)組的元素。正弦表的定義方法同上。附錄2中給出了余弦表tab_cos360和正弦表tab_sin360,精度是Q15。例1 求cos(2*pi*x/32), x是定標(biāo)為Qx的整數(shù)cos(2*p

14、i*x/32) = cos(2*pi *(360* x /32) /360);程序如下: int u = (L_mult(360, x)/32)%360; /Qx int result; result = tab_cosu; /Qx例2 求cos(x), x是定標(biāo)為Qx的整數(shù)cos(x) = cos(2*pi*(360*x/(2*pi)/360),程序如下: int pi_Qx = 3.1415*(1Qx); /Qx int u = (L_mult(360, x) / (2* pi_Qx)%360; /Q0 int result; result = tab_cosu; /Qx 上式中將pi定標(biāo)

15、為Qx的定點(diǎn)數(shù)。如何進(jìn)一步提高精度一般可以增加表的長(zhǎng)度即采樣點(diǎn)數(shù)來(lái)提高精度,但在現(xiàn)有采樣情況下,也有辦法來(lái)提高精度。方法是求出兩采樣點(diǎn)之間的斜率,根據(jù)當(dāng)前采樣點(diǎn)的位置求出更加精確的值。 例3求cos(x), x是定標(biāo)為Qx的整數(shù) int pi_Qx = 3.1415*(10.5時(shí)可以采用擬合的方法。因此: x abs(x)0.5y = atan(x) (-0.06)*x.2 + 0.5*x +0.3 0.5abs(x)5擬合可以調(diào)用matlab的命令ployfit來(lái)做,例如:x=start:0.1:stop;y=atan(x);pa=polyfit(x,y,2);上式中的運(yùn)算都是簡(jiǎn)單的乘法運(yùn)算

16、,較為簡(jiǎn)單。1.2.5 開(kāi)方運(yùn)算浮點(diǎn)開(kāi)方運(yùn)算描述為:float x, y;y = sqrt(x);定點(diǎn)求開(kāi)方有多種方法,各種方法在收斂速度上不盡相同,下面介紹幾種常用的迭代算法。1Newton-Raphson-Babylonian 算法:給定整數(shù)N, 求sqrt(N)。首先確定初值x0, 然后利用一個(gè)簡(jiǎn)單的迭代公式:xn+1 = (xn +N/xn)/2 迭代次數(shù)的選擇:迭代次數(shù)與初值x0的選取很有關(guān)系,x0越接近sqrt(N), 收斂越快。但總的來(lái)說(shuō),該方法收斂較快。缺點(diǎn)是收斂時(shí)間不確定。2確定收斂速度的算法:該方法描述如下: int sqrt(int x) int test, step;

17、if (x 0) return(-1); if (x = 0) return(0); step = 115; test = 0; while (step != 0) register int h; h = (test + step) * (test + step); if (h = 1; return(test);以上例子是32位開(kāi)放運(yùn)算,32位以上的開(kāi)方運(yùn)算可參考附錄1 void fixsqrt(UINT4* a, UINT4* b,int digits), 方法同上。求開(kāi)方還可以運(yùn)用線性擬合的方法,由于曲線變化較快,必須根據(jù)自變量的范圍分段擬合才能達(dá)到理想的精度。1.3 附錄1.3.1 附

18、錄1:定點(diǎn)函數(shù)庫(kù)/*_ | | | Function Name : L_add | | | | Purpose : | | | | 32 bits addition of the two 32 bits variables (L_var1+L_var2) with | | overflow control and saturation; the result is set at +2147483647 when | | overflow occurs or at -2147483648 when underflow occurs. | | | | Complexity weight : 2 |

19、 | | | Inputs : | | | | L_var1 32 bit long signed integer (Word32) whose value falls in the | | range : 0x8000 0000 = L_var3 = 0x7fff ffff. | | | | L_var2 32 bit long signed integer (Word32) whose value falls in the | | range : 0x8000 0000 = L_var3 = 0x7fff ffff. | | | | Outputs : | | | | none | | |

20、 | Return Value : | | | | L_var_out | | 32 bit long signed integer (Word32) whose value falls in the | | range : 0x8000 0000 = L_var_out = 0x7fff ffff. | |_|*/Word32 L_add(Word32 L_var1, Word32 L_var2)/*_ | | | Function Name : L_sub | | | | Purpose : | | | | 32 bits subtraction of the two 32 bits va

21、riables (L_var1-L_var2) with | | overflow control and saturation; the result is set at +214783647 when | | overflow occurs or at -214783648 when underflow occurs. | | | | Complexity weight : 2 | | | | Inputs : | | | | L_var1 32 bit long signed integer (Word32) whose value falls in the | | range : 0x

22、8000 0000 = L_var3 = 0x7fff ffff. | | | | L_var2 32 bit long signed integer (Word32) whose value falls in the | | range : 0x8000 0000 = L_var3 = 0x7fff ffff. | | | | Outputs : | | | | none | | | | Return Value : | | | | L_var_out | | 32 bit long signed integer (Word32) whose value falls in the | | r

23、ange : 0x8000 0000 = L_var_out = 0x7fff ffff. | |_|*/Word32 L_sub(Word32 L_var1, Word32 L_var2) /*_ | | | Function Name : add | | | | Purpose : | | | | Performs the addition (var1+var2) with overflow control and saturation;| | the 16 bit result is set at +32767 when overflow occurs or at -32768 | |

24、when underflow occurs. | | | | Complexity weight : 1 | | | | Inputs : | | | | var1 | | 16 bit short signed integer (Word16) whose value falls in the | | range : 0xffff 8000 = var1 = 0x0000 7fff. | | | | var2 | | 16 bit short signed integer (Word16) whose value falls in the | | range : 0xffff 8000 =

25、var1 = 0x0000 7fff. | | | | Outputs : | | | | none | | | | Return Value : | | | | var_out | | 16 bit short signed integer (Word16) whose value falls in the | | range : 0xffff 8000 = var_out = 0x0000 7fff. | |_|*/Word16 add(Word16 var1,Word16 var2) /*_ | | | Function Name : sature | | | | Purpose : |

26、 | | | Limit the 32 bit input to the range of a 16 bit word. | | | | Inputs : | | | | L_var1 | | 32 bit long signed integer (Word32) whose value falls in the | | range : 0x8000 0000 = L_var1 = 0x7fff ffff. | | | | Outputs : | | | | none | | | | Return Value : | | | | var_out | | 16 bit short signed integer (Word16) whose value falls in the | | range : 0xffff 8000 = var_out = 0x0000 7fff. | |_|*/Word16 sature(Word32 L_var1)/*_ | | | Function Name : sub | | | | Purpose : | | | | Performs the subtraction (var1+var2) with overflow

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論