一种定点开平方实时计算方法
【专利摘要】本发明涉及一种定点开平方实时计算方法。本算法采用一种改进型的牛顿迭代法结合Q格式数据转化进行32位以内定点的开平方运算。先根据CPU中的数据以二进制进行存储特点,判断出数据的大小,然后将该数做适当的放大,接着快速估算出被开方数的平方根所在区间,最后以从区间上限作为初始迭代值,进行若干次牛顿迭代,获取平方根值。该方法具有稳定收敛、速度快、精度高、占用存储空间少的优点。
【专利说明】一种定点开平方实时计算方法
【技术领域】
[0001]本发明属数字逆变器【技术领域】,具体涉及一种定点开平方实时计算方法。
【背景技术】
[0002]对于数字逆变器来说,电流、电压的真有效值计算,都要涉及到开平方这个运算。这些电参量的真有效值,对逆变器的实时控制来说至关重要。而开平方运算,是有效值计算过程中最耗时间的运算,如何快速、高精度地得到这些电参量的真有效值,对数字逆变器的控制性能有着重要影响。单片机自带的开平方函数,是浮点运算函数,占用较多单片机资源。传统基于牛顿迭代法的定点开平方方法,迭代初值选取得合适与否,直接影响算法的收敛性与收敛速度。
【发明内容】
[0003]本发明的目的就是克服传统算法的不足,提出一种定点开平方实时计算方法。
[0004]本发明一种定点开平方实时计算方法,具体包括以下步骤:
[0005]步骤(1):整数在CPU中是以二进制形式进行存储的。先将被开方数k强制转化成32位无符号长整型数据。从该数据的最高位第32位开始判断是否为1,若不是,则判断第31位是否为1,判断位数依次递减,直到判断出该被开方数k为m位二进制数据。
[0006]步骤⑵:判断m为奇数还是偶数。①若m值为奇数,计算X0取整后作为牛顿迭代初值。将k左移(31-m)位,得到扩大了 2(31_π)倍的K值;此时的K值具体为31位的二进制数据,记作1^4=2(31-1)/?.3'即初值为49152 ;②若m值为偶数,计算x0=2m/2, Xtl定为牛顿迭代初值。将k左移(32-m)位,得到扩大了 2(32_π)倍的K值;此时的K值具体为32位的二进制数据,记作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,则继续进行步骤(3)迭代;如果χη+1-χη的差值等于0,结束迭代,返回当前Xn作为正平方根值。
[0009]步骤(5):对于k31进行牛顿迭代得到的平方根值是真正的平方根值扩大了 2(31_m)/2倍的值,将结果乘以IOn后再右移(31-ΠΟ/2位即可得到保留了小数点后η位的平方根值;对于k32进行牛顿迭代得到的平方根值是真正的平方根值扩大了 2(32-^2倍的值,将结果乘以IOn后再右移(32-m) /2位即可得到保留了小数点后η位的平方根值。
[0010]本发明的有益效果:可快速实现32位以内定点的开平方运算;在保证较高精度的同时无需占用较多的存储空间;算法直接输出已经转化成经过Q格式处理过的结果,便于参与其他定点运算中。
【具体实施方式】
[0011]本发明是基于单片机上的对运算精度和运算时间要求比较高的算法,由于开平方根函数为了保证精度,必须计算到小数点后几位,对于没有浮点运算单元的单片机来说,调用库函数自带的开平方根函数将消耗单片机中大量的空间和时间资源,这里采用的改进型牛顿下山法及Q格式处理方法,将大大的减少运算时间,同时保证一定的精度。
[0012]一种定点开平方实时计算方法。该方法的具体步骤是:
[0013]步骤(1):整数在CPU中是以二进制形式进行存储的。先将被开方数k强制转化成32位无符号长整型数据。从该数据的最高位第32位开始判断是否为1,若不是,则判断第31位是否为1,判断位数依次递减,直到判断出该被开方数k为m位二进制数据。
[0014]步骤⑵:判断m为奇数还是偶数。①若m值为奇数,计算^ X0取整后作为牛顿迭代初值。将k左移(31-m)位,得到扩大了 2(31_π)倍的K值;此时的K值具体为31位的二进制数据,记作1^4=2(31-1)/?.3'即初值为49152 ;②若m值为偶数,计算x0=2m/2, Xtl定为牛顿迭代初值。将k左移(32-m)位,得到扩大了 2(32_π)倍的K值;此时的K值具体为32位的二进制数据,记作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,则继续进行步骤(3)迭代;如果χη+1-χη的差值等于0,结束迭代,返回当前Xn作为正平方根值。
[0017]步骤(5):对于k31进行牛顿迭代得到的平方根值是真正的平方根值扩大了 2(31_m)/2倍的值,将结果乘以IOn后再右移(31-ΠΟ/2位即可得到保留了小数点后η位的平方根值;对于k32进行牛顿迭代得到的平方根值是真正的平方根值扩大了 2(32-^2倍的值,将结果乘以IOn后再右移(32-m) /2位 即可得到保留了小数点后η位的平方根值。
【权利要求】
1.一种定点开平方计算方法,其特征在于,该方法具体包括以下步骤: 步骤(1):整数在CPU中是以二进制形式进行存储的;先将被开方数k强制转化成32位无符号长整型数据;从该数据的最高位第32位开始判断是否为1,若不是,则判断第31位是否为1,判断位数依次递减,直到判断出该被开方数k为m位二进制数据; 步骤⑵:判断m为奇数还是偶数;①若m值为奇数,计算取整后作为牛顿迭代初值;将k左移(31-m)位,得到扩大了 2(31_π)倍的K值;此时的K值具体为31位的二进制数据,记作k31,X0=2(31-1)/2+2(31-3)/2,即初值为49152 ;②若m值为偶数,计算Χ(ι=2π/2,Xtl定为牛顿迭代初值左移(32-m)位,得到扩大了 2(32_π)倍的K值;此时的K值具体为32位的二进制数据,记作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,则继续进行步骤(3)迭代;如果χη+1-χη的差值等于O,结束迭代,返回当前Xn作为正平方根值; 步骤(5):对于k31进行牛顿迭代得到的平方根值是真正的平方根值扩大了 2(31-^2倍的值,将结果乘以IOn后再右移(31-m)/2位即可得到保留了小数点后η位的平方根值;对于k32进行牛顿迭代得到的平方根值是真正的平方根值扩大了 2(32_π)/2倍的值,将结果乘以IOn后再右移(32 -m) /2位即可得到保留了小数点后η位的平方根值。
【文档编号】G06F17/15GK103885923SQ201410083718
【公开日】2014年6月25日 申请日期:2014年3月7日 优先权日:2014年3月7日
【发明者】高明煜, 詹鑫鑫, 庄圣恩, 李芸, 黄继业 申请人:杭州电子科技大学