一種定點(diǎn)開平方實(shí)時(shí)計(jì)算方法
【專利摘要】本發(fā)明涉及一種定點(diǎn)開平方實(shí)時(shí)計(jì)算方法。本算法采用一種改進(jìn)型的牛頓迭代法結(jié)合Q格式數(shù)據(jù)轉(zhuǎn)化進(jìn)行32位以內(nèi)定點(diǎn)的開平方運(yùn)算。先根據(jù)CPU中的數(shù)據(jù)以二進(jìn)制進(jìn)行存儲(chǔ)特點(diǎn),判斷出數(shù)據(jù)的大小,然后將該數(shù)做適當(dāng)?shù)姆糯?,接著快速估算出被開方數(shù)的平方根所在區(qū)間,最后以從區(qū)間上限作為初始迭代值,進(jìn)行若干次牛頓迭代,獲取平方根值。該方法具有穩(wěn)定收斂、速度快、精度高、占用存儲(chǔ)空間少的優(yōu)點(diǎn)。
【專利說明】一種定點(diǎn)開平方實(shí)時(shí)計(jì)算方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明屬數(shù)字逆變器【技術(shù)領(lǐng)域】,具體涉及一種定點(diǎn)開平方實(shí)時(shí)計(jì)算方法。
【背景技術(shù)】
[0002]對(duì)于數(shù)字逆變器來說,電流、電壓的真有效值計(jì)算,都要涉及到開平方這個(gè)運(yùn)算。這些電參量的真有效值,對(duì)逆變器的實(shí)時(shí)控制來說至關(guān)重要。而開平方運(yùn)算,是有效值計(jì)算過程中最耗時(shí)間的運(yùn)算,如何快速、高精度地得到這些電參量的真有效值,對(duì)數(shù)字逆變器的控制性能有著重要影響。單片機(jī)自帶的開平方函數(shù),是浮點(diǎn)運(yùn)算函數(shù),占用較多單片機(jī)資源。傳統(tǒng)基于牛頓迭代法的定點(diǎn)開平方方法,迭代初值選取得合適與否,直接影響算法的收斂性與收斂速度。
【發(fā)明內(nèi)容】
[0003]本發(fā)明的目的就是克服傳統(tǒng)算法的不足,提出一種定點(diǎn)開平方實(shí)時(shí)計(jì)算方法。
[0004]本發(fā)明一種定點(diǎn)開平方實(shí)時(shí)計(jì)算方法,具體包括以下步驟:
[0005]步驟(1):整數(shù)在CPU中是以二進(jìn)制形式進(jìn)行存儲(chǔ)的。先將被開方數(shù)k強(qiáng)制轉(zhuǎn)化成32位無符號(hào)長整型數(shù)據(jù)。從該數(shù)據(jù)的最高位第32位開始判斷是否為1,若不是,則判斷第31位是否為1,判斷位數(shù)依次遞減,直到判斷出該被開方數(shù)k為m位二進(jìn)制數(shù)據(jù)。
[0006]步驟⑵:判斷m為奇數(shù)還是偶數(shù)。①若m值為奇數(shù),計(jì)算X0取整后作為牛頓迭代初值。將k左移(31-m)位,得到擴(kuò)大了 2(31_π)倍的K值;此時(shí)的K值具體為31位的二進(jìn)制數(shù)據(jù),記作1^4=2(31-1)/?.3'即初值為49152 ;②若m值為偶數(shù),計(jì)算x0=2m/2, Xtl定為牛頓迭代初值。將k左移(32-m)位,得到擴(kuò)大了 2(32_π)倍的K值;此時(shí)的K值具體為32位的二進(jìn)制數(shù)據(jù),記作k32,X0=232/2,即初值為65536。Xtl為K的牛頓迭代初值。
[0007]步驟(3):牛頓迭代公式為Xn+1=l/2 (Xn+K/Xn);將初值Xtl代入公式,得到X1 ;Χη為X0迭代η次后得到的值,Χη+1為Xtl迭代η+1次后得到的值。
[0008]步驟(4):判斷Χη+1_Χη的值是否等于0,如果差值大于0,則繼續(xù)進(jìn)行步驟(3)迭代;如果χη+1-χη的差值等于0,結(jié)束迭代,返回當(dāng)前Xn作為正平方根值。
[0009]步驟(5):對(duì)于k31進(jìn)行牛頓迭代得到的平方根值是真正的平方根值擴(kuò)大了 2(31_m)/2倍的值,將結(jié)果乘以IOn后再右移(31-ΠΟ/2位即可得到保留了小數(shù)點(diǎn)后η位的平方根值;對(duì)于k32進(jìn)行牛頓迭代得到的平方根值是真正的平方根值擴(kuò)大了 2(32-^2倍的值,將結(jié)果乘以IOn后再右移(32-m) /2位即可得到保留了小數(shù)點(diǎn)后η位的平方根值。
[0010]本發(fā)明的有益效果:可快速實(shí)現(xiàn)32位以內(nèi)定點(diǎn)的開平方運(yùn)算;在保證較高精度的同時(shí)無需占用較多的存儲(chǔ)空間;算法直接輸出已經(jīng)轉(zhuǎn)化成經(jīng)過Q格式處理過的結(jié)果,便于參與其他定點(diǎn)運(yùn)算中。
【具體實(shí)施方式】
[0011]本發(fā)明是基于單片機(jī)上的對(duì)運(yùn)算精度和運(yùn)算時(shí)間要求比較高的算法,由于開平方根函數(shù)為了保證精度,必須計(jì)算到小數(shù)點(diǎn)后幾位,對(duì)于沒有浮點(diǎn)運(yùn)算單元的單片機(jī)來說,調(diào)用庫函數(shù)自帶的開平方根函數(shù)將消耗單片機(jī)中大量的空間和時(shí)間資源,這里采用的改進(jìn)型牛頓下山法及Q格式處理方法,將大大的減少運(yùn)算時(shí)間,同時(shí)保證一定的精度。
[0012]一種定點(diǎn)開平方實(shí)時(shí)計(jì)算方法。該方法的具體步驟是:
[0013]步驟(1):整數(shù)在CPU中是以二進(jìn)制形式進(jìn)行存儲(chǔ)的。先將被開方數(shù)k強(qiáng)制轉(zhuǎn)化成32位無符號(hào)長整型數(shù)據(jù)。從該數(shù)據(jù)的最高位第32位開始判斷是否為1,若不是,則判斷第31位是否為1,判斷位數(shù)依次遞減,直到判斷出該被開方數(shù)k為m位二進(jìn)制數(shù)據(jù)。
[0014]步驟⑵:判斷m為奇數(shù)還是偶數(shù)。①若m值為奇數(shù),計(jì)算^ X0取整后作為牛頓迭代初值。將k左移(31-m)位,得到擴(kuò)大了 2(31_π)倍的K值;此時(shí)的K值具體為31位的二進(jìn)制數(shù)據(jù),記作1^4=2(31-1)/?.3'即初值為49152 ;②若m值為偶數(shù),計(jì)算x0=2m/2, Xtl定為牛頓迭代初值。將k左移(32-m)位,得到擴(kuò)大了 2(32_π)倍的K值;此時(shí)的K值具體為32位的二進(jìn)制數(shù)據(jù),記作k32,X0=232/2,即初值為65536。Xtl為K的牛頓迭代初值。
[0015]步驟(3):牛頓迭代公式為Xn+1=l/2 (Xn+K/Xn);將初值Xtl代入公式,得到X1 ;Χη為X0迭代η次后得到的值,Χη+1為Xtl迭代η+1次后得到的值。
[0016]步驟(4):判斷Χη+1_Χη的值是否等于0,如果差值大于0,則繼續(xù)進(jìn)行步驟(3)迭代;如果χη+1-χη的差值等于0,結(jié)束迭代,返回當(dāng)前Xn作為正平方根值。
[0017]步驟(5):對(duì)于k31進(jìn)行牛頓迭代得到的平方根值是真正的平方根值擴(kuò)大了 2(31_m)/2倍的值,將結(jié)果乘以IOn后再右移(31-ΠΟ/2位即可得到保留了小數(shù)點(diǎn)后η位的平方根值;對(duì)于k32進(jìn)行牛頓迭代得到的平方根值是真正的平方根值擴(kuò)大了 2(32-^2倍的值,將結(jié)果乘以IOn后再右移(32-m) /2位 即可得到保留了小數(shù)點(diǎn)后η位的平方根值。
【權(quán)利要求】
1.一種定點(diǎn)開平方計(jì)算方法,其特征在于,該方法具體包括以下步驟: 步驟(1):整數(shù)在CPU中是以二進(jìn)制形式進(jìn)行存儲(chǔ)的;先將被開方數(shù)k強(qiáng)制轉(zhuǎn)化成32位無符號(hào)長整型數(shù)據(jù);從該數(shù)據(jù)的最高位第32位開始判斷是否為1,若不是,則判斷第31位是否為1,判斷位數(shù)依次遞減,直到判斷出該被開方數(shù)k為m位二進(jìn)制數(shù)據(jù); 步驟⑵:判斷m為奇數(shù)還是偶數(shù);①若m值為奇數(shù),計(jì)算取整后作為牛頓迭代初值;將k左移(31-m)位,得到擴(kuò)大了 2(31_π)倍的K值;此時(shí)的K值具體為31位的二進(jìn)制數(shù)據(jù),記作k31,X0=2(31-1)/2+2(31-3)/2,即初值為49152 ;②若m值為偶數(shù),計(jì)算Χ(ι=2π/2,Xtl定為牛頓迭代初值左移(32-m)位,得到擴(kuò)大了 2(32_π)倍的K值;此時(shí)的K值具體為32位的二進(jìn)制數(shù)據(jù),記作k32,X0 = 2 32/2,即初值為65536 ;X0為K的牛頓迭代初值; 步驟(3):牛頓迭代公式為Xn+1=l/2 (Xn+K/Xn);將初值Xtl代入公式,得到X1 ;Χη為X0迭代η次后得到的值,Χη+1為Xtl迭代η+1次后得到的值; 步驟(4):判斷Χη+1_Χη的值是否等于O,如果差值大于O,則繼續(xù)進(jìn)行步驟(3)迭代;如果χη+1-χη的差值等于O,結(jié)束迭代,返回當(dāng)前Xn作為正平方根值; 步驟(5):對(duì)于k31進(jìn)行牛頓迭代得到的平方根值是真正的平方根值擴(kuò)大了 2(31-^2倍的值,將結(jié)果乘以IOn后再右移(31-m)/2位即可得到保留了小數(shù)點(diǎn)后η位的平方根值;對(duì)于k32進(jìn)行牛頓迭代得到的平方根值是真正的平方根值擴(kuò)大了 2(32_π)/2倍的值,將結(jié)果乘以IOn后再右移(32 -m) /2位即可得到保留了小數(shù)點(diǎn)后η位的平方根值。
【文檔編號(hào)】G06F17/15GK103885923SQ201410083718
【公開日】2014年6月25日 申請(qǐng)日期:2014年3月7日 優(yōu)先權(quán)日:2014年3月7日
【發(fā)明者】高明煜, 詹鑫鑫, 莊圣恩, 李蕓, 黃繼業(yè) 申請(qǐng)人:杭州電子科技大學(xué)