浮点转定点方法总结.docx

上传人:b****8 文档编号:27872525 上传时间:2023-07-05 格式:DOCX 页数:20 大小:47.64KB
下载 相关 举报
浮点转定点方法总结.docx_第1页
第1页 / 共20页
浮点转定点方法总结.docx_第2页
第2页 / 共20页
浮点转定点方法总结.docx_第3页
第3页 / 共20页
浮点转定点方法总结.docx_第4页
第4页 / 共20页
浮点转定点方法总结.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

浮点转定点方法总结.docx

《浮点转定点方法总结.docx》由会员分享,可在线阅读,更多相关《浮点转定点方法总结.docx(20页珍藏版)》请在冰豆网上搜索。

浮点转定点方法总结.docx

浮点转定点方法总结

浮点转定点方法总结

—孔德琦

 

定点运算方法

数的定标

对某些处理器而言,参与数值运算的数就是16位的整型数。

但在许多情况下,数学运算过程中的数不一定都是整数。

那么,如何处理小数的呢?

应该说,处理器本身无能为力。

那么是不是就不能处理各种小数呢?

当然不是。

这其中的关键就是由程序员来确定一个数的小数点处于16位中的哪一位。

这就是数的定标。

通过设定小数点在16位数中的不同位置,就可以表示不同大小和不同精度的小数了。

数的定标用Q表示法。

表列出了一个16位数的16种Q表示能表示的十进制数值范围和近似的精度。

Q表示

精度(近似)

十进制数表示范围

Q15

-1≤X≤

Q14

-2≤X≤

Q13

-4≤X≤

Q12

-8≤X≤

Q11

-16≤X≤

Q10

-32≤X≤

Q9

-64≤X≤

Q8

-128≤X≤

Q7

-256≤X≤

Q6

-512≤X≤

Q5

-1024≤X≤

Q4

-2048≤X≤

Q3

-4096≤X≤

Q2

-8192≤X≤

Q1

-16384≤X≤

Q0

1

-32768≤X≤32767

表Q表示、S表示及数值范围

从表可以看出,同样一个16位数,若小数点设定的位置不同,它所表示的数也就不同。

例如:

16进制数2000H=8192,用Q0表示

16进制数2000H=,用Q15表示

从表还可以看出,不同的Q所表示的数不仅范围不同,而且精度也不相同。

Q越大,数值范围越小,但精度越高;相反,Q越小,数值范围越大,但精度就越低。

例如,Q0的数值范围是-32768到+32767,其精度为1,而Q15的数值范围为-1到,精度为1/32768=。

因此,对定点数而言,数值范围与精度是一对矛盾,一个变量要想能够表示比较大的数值范围,必须以牺牲精度为代价;而想提高精度,则数的表示范围就相应地减小。

在实际的定点算法中,为了达到最佳的性能,必须充分考虑到这一点。

浮点数与定点数的转换关系可表示为:

浮点数(x)转换为定点数(

):

定点数(

)转换为浮点数(x):

例如,浮点数x=,定标Q=15,则定点数

,式中

表示下取整。

反之,一个用Q=15表示的定点数16384,其浮点数为16384×2-15

=16384/32768=。

1.2c语言:

从浮点到定点

下面所描述的几种基本运算是浮点到定点转换中经常遇到的,从中可以体会到一些基本的技巧和方法。

加法

设浮点加法运算的表达式为:

floatx,y,z;

z=x+y;

将浮点加法/减法转化为定点加法/减法时最重要的一点就是必须保证两个操作数的定标值一样。

若两者不一样,则在做加法/减法运算前先进行小数点的调整。

为保证运算精度,需使Q值小的数调整为与另一个数的Q值一样大。

此外,在做加法/减法运算时,必须注意结果可能会超过16位表示,即数的动态范围。

如果加法/减法的结果超出16位的表示范围,则必须保留32位结果,以保证运算的精度。

1.结果不超过16位表示范围

设x的Q值为Qx,y的Q值为Qy,且Qx>Qy,加法/减法结果z的定标值为Qz,则

z=x+y

=

=

一般情况,我们取x,y和z的定标值相同,即Qx=Qy=Qz=Qa。

所以定点加法可以描述为:

shortx,y,z;

定点减法:

shortx,y,z;

2.结果超过16位表示范围

设x的Q值为Qx,y的Q值为Qy,且Qx>Qy,加法结果z的定标值为Qz,则定点加法为:

intx,y;

longtemp,z;

temp=y<<(Qx-Qy);

temp=x+temp;

z=temp>>(Qx-Qz),若Qx≥Qz

z=temp<<(Qz-Qx),若Qx≤Qz

一般情况,我们取x,y和z的定标值相同,即Qx=Qy=Qz=Qa。

所以定点加法可以描述为:

intx,y,z;

定点减法:

intx,y,z;

3.结果超过32位表示范围

这种情况下位数超出了标准c语言的数的表示范围,只能用数组来保存变量。

定点加法可以描述为:

#defineNN_DIGITunsignedint

NN_DIGITx[digits],y[digits],z[digits];

结果超过32位表示范围

这种情况下位数超出了标准c语言的数的表示范围,只能用数组来保存变量。

定点乘法可表示为:

#defineNN_DIGITunsignedint

NN_DIGITx[digits];

NN_DIGITy[digits];

NN_DIGITz[2*digits];

NN_Mult(z,x,y,digits);

应注意的是以上32位乘法都是无符号数操作,如果需要做有符号数乘法,则需要根据乘数的符号来判断。

例1

设x=,y=,则浮点运算值为z=×=;

设Qx=10,Qy=9,Qz=5,所以

intx=18841;32位除法

设浮点除法运算的表达式为:

floatx,y,z;

z=x/y;

假设经过统计后被除数x的定标值为Qx,除数y的定标值为Qy,商z的定标值为Qz,则

z=x/y

=

所以定点表示的除法为:

intx,y,z;

z=L_shl(x,(Qz-Qx+Qy))/y;32位以上的除法

这种情况下位数超出了标准c语言的数的表示范围,只能用数组来保存变量。

#defineNN_DIGITunsignedint

NN_DIGITx[2*digits];

2+*x+

拟合可以调用matlab的命令ployfit来做,例如:

x=[start:

:

stop];

y=atan(x);

pa=polyfit(x,y,2);

上式中的运算都是简单的乘法运算,较为简单。

开方运算

浮点开方运算描述为:

floatx,y;

y=sqrt(x);

定点求开方有多种方法,各种方法在收敛速度上不尽相同,下面介绍几种常用的迭代算法。

1.Newton-Raphson-Babylonian算法:

给定整数N,求sqrt(N)。

首先确定初值x[0],然后利用一个简单的迭代公式:

x[n+1]=(x[n]+N/x[n])/2

迭代次数的选择:

迭代次数与初值x[0]的选取很有关系,x[0]越接近sqrt(N),收敛越快。

但总的来说,该方法收敛较快。

缺点是收敛时间不确定。

2.确定收敛速度的算法:

该方法描述如下:

intsqrt(intx)

{inttest,step;

if(x<0)return(-1);if(x==0)return(0);

step=1<<15;

test=0;

while(step!

=0)

{

registerinth;

h=(test+step)*(test+step);

if(h<=x){test+=step;}

if(h==x)break;

step>>=1;

}

return(test);}

以上例子是32位开放运算,32位以上的开方运算可参考附录1voidfixsqrt(UINT4*a,UINT4*b,intdigits),方法同上。

求开方还可以运用线性拟合的方法,由于曲线变化较快,必须根据自变量的范围分段拟合才能达到理想的精度。

附录

附录1:

定点函数库

/*___________________________________________________________________________

||

|FunctionName:

L_add|

||

|Purpose:

|

||

|32bitsadditionofthetwo32bitsvariables(L_var1+L_var2)with|

|overflowcontrolandsaturation;theresultissetat+47when|

|overflowoccursorat-48whenunderflowoccurs.|

||

|Complexityweight:

2|

||

|Inputs:

|

||

|L_var132bitlongsignedinteger(Word32)whosevaluefallsinthe|

|range:

0x80000000<=L_var3<=0x7fffffff.|

||

|L_var232bitlongsignedinteger(Word32)whosevaluefallsinthe|

|range:

0x80000000<=L_var3<=0x7fffffff.|

||

|Outputs:

|

||

|none|

||

|ReturnValue:

|

||

|L_var_out|

|32bitlongsignedinteger(Word32)whosevaluefallsinthe|

|range:

0x80000000<=L_var_out<=0x7fffffff.|

|___________________________________________________________________________|

*/

Word32L_add(Word32L_var1,Word32L_var2)

/*___________________________________________________________________________

||

|FunctionName:

L_sub|

||

|Purpose:

|

||

|32bitssubtractionofthetwo32bitsvariables(L_var1-L_var2)with|

|overflowcontrolandsaturation;theresultissetat+7when|

|overflowoccursorat-8whenunderflowoccurs.|

||

|Complexityweight:

2|

||

|Inputs:

|

||

|L_var132bitlongsignedinteger(Word32)whosevaluefallsinthe|

|range:

0x80000000<=L_var3<=0x7fffffff.|

||

|L_var232bitlongsignedinteger(Word32)whosevaluefallsinthe|

|range:

0x80000000<=L_var3<=0x7fffffff.|

||

|Outputs:

|

||

|none|

||

|ReturnValue:

|

||

|L_var_out|

|32bitlongsignedinteger(Word32)whosevaluefallsinthe|

|range:

0x80000000<=L_var_out<=0x7fffffff.|

|___________________________________________________________________________|

*/

Word32L_sub(Word32L_var1,Word32L_var2)

/*___________________________________________________________________________

||

|FunctionName:

add|

||

|Purpose:

|

||

|Performstheaddition(var1+var2)withoverflowcontrolandsaturation;|

|the16bitresultissetat+32767whenoverflowoccursorat-32768|

|whenunderflowoccurs.|

||

|Complexityweight:

1|

||

|Inputs:

|

||

|var1|

|16bitshortsignedinteger(Word16)whosevaluefallsinthe|

|range:

0xffff8000<=var1<=0x00007fff.|

||

|var2|

|16bitshortsignedinteger(Word16)whosevaluefallsinthe|

|range:

0xffff8000<=var1<=0x00007fff.|

||

|Outputs:

|

||

|none|

||

|ReturnValue:

|

||

|var_out|

|16bitshortsignedinteger(Word16)whosevaluefallsinthe|

|range:

0xffff8000<=var_out<=0x00007fff.|

|___________________________________________________________________________|

*/

Word16add(Word16var1,Word16var2)

/*___________________________________________________________________________

||

|FunctionName:

sature|

||

|Purpose:

|

||

|Limitthe32bitinputtotherangeofa16bitword.|

||

|Inputs:

|

||

|L_var1|

|32bitlongsignedinteger(Word32)whosevaluefallsinthe|

|range:

0x80000000<=L_var1<=0x7fffffff.|

||

|Outputs:

|

||

|none|

||

|ReturnValue:

|

||

|var_out|

|16bitshortsignedinteger(Word16)whosevaluefallsinthe|

|range:

0xffff8000<=var_out<=0x00007fff.|

|___________________________________________________________________________|

*/

Word16sature(Word32L_var1)

/*___________________________________________________________________________

||

|FunctionName:

sub|

||

|Purpose:

|

||

|Performsthesubtraction(var1+var2)withoverflowcontrolandsatu-|

|ration;the16bitresultissetat+32767whenoverflowoccursorat|

|-32768whenunderflowoccurs.|

||

|Complexityweight:

1|

||

|Inputs:

|

||

|var1|

|16bitshortsignedinteger(Word16)whosevaluefallsinthe|

|range:

0xffff8000<=var1<=0x00007fff.|

||

|var2|

|16bitshortsignedinteger(Word16)whosevaluefallsinthe|

|range:

0xffff8000<=var1<=0x00007fff.|

||

|Outputs:

|

||

|none|

||

|ReturnValue:

|

||

|var_out|

|16bitshortsignedinteger(Word16)whosevaluefallsinthe|

|range:

0xffff8000<=var_out<=0x00007fff.|

|___________________________________________________________________________|

*/

Word16sub(Word16var1,Word16var2)

/*___________________________________________________________________________

||

|FunctionName:

L_mult|

||

|Purpose:

|

||

|L_multisthe32bitresultofthemultiplicationofvar1timesvar2|

|withoneshiftleft.:

|

|L_mult(var1,var2)=shl((var1timesvar2),1)and|

|L_mult(-32768,-32768)=47.|

||

|Complexityweight:

1|

||

|Inputs:

|

||

|var1|

|16bitshortsignedinteger(Word16)whosevaluefallsinthe|

|range:

0xffff8000<=var1<=0x00007fff.|

||

|var2|

|16bitshortsignedinteger(Word16)whosevaluefallsinthe|

|range:

0xffff8000<=var1<=0x00007fff.|

||

|Outputs:

|

||

|none|

||

|ReturnValue:

|

||

|L_var_out|

|32bitlongsignedinteger(Word32)whosevaluefallsinthe|

|range:

0x80000000<=L_var_out<=0x7fffffff.|

|___________________________________________________________________________|

*/

Word32L_mult(Word16var1,Word16var2)

/*Computesthesquarerootofafixpointnumbera=square(b).*/

/*length:

a[digits],b[2*digits]*/

voidfixsqrt(UINT4*a,UINT4*b,intdigits)

{

Returnscarry.

Lengths:

a[digits],b[digits],c[digits].

*/

NN_DIGITNN_Add(a,b,c,digits)

NN_DIGIT*a,*b,*c;

unsignedintdigits;

/*Computesa=b-c.Returnsborrow.

Lengths:

a[digits],b[digits],c[digits].

*/

NN_DIGITNN_Sub(a,b,c,digits)

NN_DIGIT*a,*b,*c;

unsignedintdigits;

/*Computesa=b*c.

Lengths:

a[2*digits],b[digits],c[digits].

Assumesdigits

*/

voidNN_Mult(a,b,c,digits)

NN_DIGIT*a,*b,*c;

unsignedintdigits;

/*Returnssignofa-b.*/

intNN_Cmp(a,b,digits)

NN_DIGIT*a,*b;

unsignedintdigits;

/*Computesa=b*2^c.,shiftsleftcbits),returningcarry.

Requiresc

NN_DIGITNN_LShift(a,b,c,digits)

NN_DIGIT*a,*b;

unsignedintc,digits;

/*Computesa=bdiv2^c.,shiftsrightcbits),returningcarry.

Requ

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 理化生

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1