浮点转定点方法总结

上传人:lis****210 文档编号:176970475 上传时间:2022-12-24 格式:DOCX 页数:18 大小:37.88KB
返回 下载 相关 举报
浮点转定点方法总结_第1页
第1页 / 共18页
浮点转定点方法总结_第2页
第2页 / 共18页
浮点转定点方法总结_第3页
第3页 / 共18页
点击查看更多>>
资源描述
浮点转定点方法总结孔德琦目录定点运算方法 错误!未定义书签。数的定标 错误!未定义书签。c语言:从浮点到定点 错误!未定义书签。加法错.误!未定义书签乘法错.误!未定义书签除法错.误!未定义书签三角函数运算错. 误!未定义书签开方运算错.误!未定义书签附录 错误!未定义书签。附录1:定点函数库错. 误!未定义书签附录2:正弦和余弦表错. 误!未定义书签。定点运算方法数的定标对某些处理器而言,参与数值运算的数就是16位的整型数。但在许多情况下,数学运 算过程中的数不一定都是整数。那么,如何处理小数的呢?应该说,处理器本身无能为力 那么是不是就不能处理各种小数呢?当然不是。这其中的关键就是由程序员来确定一个数的 小数点处于16位中的哪一位。这就是数的定标。通过设定小数点在16位数中的不同位置,就可以表示不同大小和不同精度的小数了。 数的定标用Q表示法。表列出了一个16位数的16种Q表示能表示的十进制数值范围和近似 的精度。Q表示精度(近似)十进制数表示范围Q15-1WXWQ14-2WXWQ13-4WXWQ12-8WXWQ11-16WXWQ10-32WXWQ9-64WXWQ8-128WXWQ7-256WXWQ6-512WXWQ5-1024WXWQ4-2048WXWQ3-4096WXWQ2-8192WXWQ1-16384WXWQ01-32768WXW32767表Q表示、S表示及数值范围从表可以看出,同样一个16位数,若小数点设定的位置不同,它所表示的数也就不同。 例如:16进制数2000H=8192,用Q0表示16进制数2000H=,用Q15表示从表还可以看出,不同的Q所表示的数不仅范围不同,而且精度也不相同。Q越大,数 值范围越小,但精度越高;相反,Q越小,数值范围越大,但精度就越低。例如,Q0的数值 范围是-32768到+32767,其精度为1,而Q15的数值范围为-1至U,精度为1/32768 =。因 此,对定点数而言,数值范围与精度是一对矛盾,一个变量要想能够表示比较大的数值范围, 必须以牺牲精度为代价;而想提高精度,则数的表示范围就相应地减小。在实际的定点算法 中,为了达到最佳的性能,必须充分考虑到这一点。浮点数与定点数的转换关系可表示为:浮点数(X)转换为定点数(x ): X = (int)x *2Qq q定点数(xq)转换为浮点数(x): x = (float)x *2-Q例如,浮点数X=,定标Q = 15,则定点数xq = Lo.5X32768J= 16384,式中L表示下 q取整。反之,一个用Q=15表示的定点数16384,其浮点数为16384 X2-15 = 16384/32768=。1.2 c语言:从浮点到定点下面所描述的几种基本运算是浮点到定点转换中经常遇到的,从中可以体会到一些基本 的技巧和方法。加法设浮点加法运算的表达式为:floa t x,y,z;z=x+y;将浮点加法/减法转化为定点加法/减法时最重要的一点就是必须保证两个操作数的定 标值一样。若两者不一样,则在做加法/减法运算前先进行小数点的调整。为保证运算精度, 需使Q值小的数调整为与另一个数的Q值一样大。此外,在做加法/减法运算时,必须注意 结果可能会超过16位表示,即数的动态范围。如果加法/减法的结果超出16位的表示范围, 则必须保留32位结果,以保证运算的精度。1.结果不超过16位表示范围设x的Q值为Qx,y的Q值为Qy,且QxQy,加法/减法结果z的定标值为Qz,则z = x+yz - 2-Qz 二 x - 2-Qx + y - 2-Qyqqq=x - 2-QX + y - 2(Qx-Qy) - 2-QXqq=x + y - 2(Qx-Qy) - 2-Qxq qz = x + y - 2(Qx-Qy) - 2(Qz-Qx)q q q一般情况,我们取x,y和z的定标值相同,即Qx = Qy = Qz = Qa。所以定点加法可以描述为:sho rt x, y, z ;定点减法:short x, y, z ;2结果超过16位表示范围设X的Q值为Qx, y的Q值为Qy,且QxQy,加法结果z的定标值为Qz,则定点加法为: int x,y;long temp,z;temp = y(Qx-Qy);t emp=x + temp;z = temp(Qx-Qz),若 Qx三Qzz = temp(Qz-Qx),若 QxWQz一般情况,我们取x,y和z的定标值相同,即Qx = Qy = Qz = Qa。所以定点加法可以描述为:int x, y, z ;定点减法:int x, y, z ;3. 结果超过32位表示范围这种情况下位数超出了标准c语言的数的表示范围,只能用数组来保存变量。 定点加法可以描述为:#define NN_DIGIT unsigned intNN_DIGITxdigits,ydigits,zdigits ; z - 2-Qz x - y - 2-(+)zq(x y )2-(+)结果超过 32 位表示范围qq qq q q这种情况下位数超出了标准c语言的数的表示范围,只能用数组来保存变量。 定点乘法可表示为:#define NN_DIGIT unsigned intNN_DIGIT x digits;NN_DIGIT y digits; NN_DIGIT z 2* digits;NN_Mult (z, x, y, digits);应注意的是以上32位乘法都是无符号数操作,如果需要做有符号数乘法,则需要根据 乘数的符号来判断。例1设x = , y =,则浮点运算值为z =x =;设 Qx = 10,Qy = 9,Qz = 5,所以int x = 18841;32位除法设浮点除法运算的表达式为:float x,y,z; z = x/y;假设经过统计后被除数x的定标值为Qx,除数y的定标值为Qy,商z的定标值为Qz,z = x/yx - 2-Qx-q-y - 2-QyqX - 2(Qz-Qx +Qy)z =yq所以定点表示的除法为:int x,y,z;z = L_shl(x, (Qz-Qx+Qy) )/y;32 位以上的除法这种情况下位数超出了标准c语言的数的表示范围,只能用数组来保存变量。#define NN_DIGIT unsigned intNN_DIGIT x 2*digits;+ *x +abs(x)5拟合可以调用matlab的命令ployfit来做,例如: x=start:stop;y=a tan(x);pa=pol yfit( x,y,2);上式中的运算都是简单的乘法运算,较为简单。开方运算浮点开方运算描述为:float x, y;y = sqr t( x);定点求开方有多种方法,各种方法在收敛速度上不尽相同,下面介绍几种常用的迭代算法。1. New ton-Raphson-Babylonian 算法:给定整数N,求sqrt(N)。首先确定初值x0,然后利用一个简单的迭代公式: xn+1 = (xn +N/xn)/2迭代次数的选择:迭代次数与初值x0的选取很有关系,x0越接近sqrt(N),收敛越快。但总的来说, 该方法收敛较快。缺点是收敛时间不确定。2.确定收敛速度的算法: 该方法描述如下:int sqrt(int x) int test, step;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位开放运算,32位以上的开方运算可参考附录1 void fixsqrt(UINT4* a, UINT4* b,in t digi ts),方法同上。求开方还可以运用线性拟合的方法,由于曲线变化较快,必须根据自变量的范围分段拟合才 能达到理想的精度。附录附录1:定点函数库/*|Function Name:L_add|Purpose:|32 bitsadditionofthe two 32 bits variables (L_var1+L_var2) with| overflow control and saturation; the result is set at +47 when | overflow occurs or at -48 when underflow occurs.|Complexityweight:2|Inputs :|L_var132bitlong 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|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 bitssubtractionof the two 32 bits variables (L_var1-L_var2) with | overflow control and saturation; the result is set at +7 when | | overflow occurs or at -8 when underflow occurs. |Complexityweight : 2|Inputs :| L_var1 32 bit long signed integer (Word32) whose valuefallsin 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|Return Value :|L_var_out|32 bit long signed integer (Word32) whose valuefallsin the|range : 0x8000 0000 = L_var_out = 0x7fff ffff.|*/Word32 L_sub(Word32 L_var1, Word32 L_var2)/*|Function Name: add|Purpose :|Performs theaddition (var1+var2) with overflow control and saturation;|the 16 bit resultis set at +32767 when overflow occurs or at -32768 |when underflow occurs.|Complexity weight: 1|Inputs :|var1|16 bit short signedinteger (Word16) whose valuefallsinthe|range : 0xffff 8000= var1 = 0x0000 7fff.|var2|16 bit short signedinteger (Word16) whose valuefallsinthe|range : 0xffff 8000= var1 = 0x0000 7fff.|Outputs :|none|Return Value :|var_out|16 bit short signedinteger (Word16) whose valuefallsinthe|range : 0xffff 8000= var_out = 0x0000 7fff.| */Word16 add(Word16 var1,Word16 var2)/*|Function Name : sature|Purpose :|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 inthe|range : 0x8000 0000 = L_var1 = 0x7fff ffff.|Outputs :|none|Return Value :|var_out|16 bit short signed integer (Word16) whose valuefallsin the|range : 0xffff 8000 = var_out = 0x0000 7fff.| */Word16 sature(Word32 L_var1)/*|Function Name : sub|Purpose :|Performs the subtraction (var1+var2) with overflow control and satu- |ration; the 16 bitresultisset at +32767 when overflow occurs or at |-32768 when underflowoccurs.|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 valuefallsin the|range : 0xffff 8000 = var1= 0x0000 7fff.|Outputs:|none|ReturnValue :|var_out|16 bit short signed integer(Word16) whose valuefallsin the|range : 0xffff 8000 = var_out = 0x0000 7fff.| */Word16 sub(Word16 var1,Word16 var2)/*|Function Name:L_mult|Purpose :|L_mult is the32bitresult of the multiplication of var1 times var2 | with one shift left .: | L_mult(var1,var2) = shl(var1 times var2),1) and | | L_mult(-32768,-32768) = 47. |Complexity weight : 1|Inputs :|var1|16 bit short signedinteger (Word16) whose valuefallsinthe|range : 0xffff 8000= var1 = 0x0000 7fff.|var2|16 bit short signedinteger (Word16) whose valuefallsinthe|range : 0xffff 8000= var1 = 0x0000 7fff.|Outputs:|none|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_mult(Word16 var1,Word16 var2)/* Computes the square root of a fixpoint number a = square(b).*/ /* length :adigits, b2*digits */void fixsqrt(UINT4* a, UINT4* b, int digits)Returns carry.Lengths: adigits, bdigits, cdigits.*/NN_DIGIT NN_Add (a, b, c, digits)NN_DIGIT *a, *b, *c;unsigned int digits;/* Computes a = b - c. Returns borrow.Lengths: adigits, bdigits, cdigits.*/NN_DIGIT NN_Sub (a, b, c, digits)NN_DIGIT *a, *b, *c;unsigned int digits;/* Computes a = b * c.Lengths: a2*digits, bdigits, cdigits.Assumes digits MAX_NN_DIGITS.*/void NN_Mult (a, b, c, digits)NN_DIGIT *a, *b, *c;unsigned int digits;/* Returns sign of a - b. */int NN_Cmp (a, b, digits)NN_DIGIT *a, *b;unsigned int digits;/* Computes a = b * 2c shifts left c bits), returning carry.Requires c NN_DIGIT_BITS. */NN_DIGIT NN_LShift (a, b, c, digits)NN_DIGIT *a, *b;unsigned int c, digits;/* Computes a = b div 2c ., shifts right c bits), returning carry.Requires: c 0, cDigits 2 * MAX_NN_DIGITS, dDigits 0, cDigits 2 * MAX_NN_DIGITS,dDigits 0, bDigits 2 * MAX_NN_DIGITS, cDigits MAX_NN_DIGITS. */ void NN_Mod (a, b, bDigits, c, cDigits)NN_DIGIT *a, *b, *c;unsigned int bDigits, cDigits;NN_DIGIT t2 * MAX_NN_DIGITS;NN_Divmod (t, a, b, bDigits, c, cDigits);/* Returns the significant length of a in bits, where a is a digit. */ static unsigned int NN_DigitBits (a)NN_DIGIT a;unsigned int i;for (i = 0; i = 1) if (a = 0) break;return (i);附录2:正弦和余弦表/*| Table for calculating sin(x) , fixed Q15.| Author: luj| Date: */Wordl6 tab_sin360 = /*sin(2*pi*i/360)*215*/;/*| Table for calculating cos(x) , fixed Q15.| Author: luj| Date:*/Word16 tab_cos360 = /*cos(2*pi*i/360)*215*/;
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 办公文档 > 解决方案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!