一个极其怪的问题!
一个极其怪的问题! <br /><br /> fw0=5625636.482914;<br /> fw1=16796184.027028;<br /> fw2=-16716106.802805;<br /> fw3=5545557.1237500 ;<br /> fw=1.0-((fw1+fw2+fw3)/fw0); <br /> sw0 =(short) ( fw1/fw0 * 8192 ); //Q13<br /> sw1 =(short) ( fw2/fw0 * 8192 ); //Q13<br /> sw2 = (short)( fw3/fw0 * 8192 ); //Q13<br /> w=w=w=in_data;<br /> fwf=fwf=fwf=in_data;<br /><br />for(i=0;i<n;i++)<br /> {<br /> x=in_data;<br /><br />(1) sresult=(short)(x + <br /> ((sw0*(w-x)+sw1*(w-x)+sw2*(w-x)) >>13) );<br /> ////////////////////////////////////////////////////////<br />(2) sresult=(short)(x + <br /> ((sw0*(w-x)+sw1*(w-x)+sw2*(w-x))/8192) );<br /> ////////////////////////////////////////////////////////<br /> w=w;<br /> w=w;<br /> w=sresult;<br /> if(fresult!=sresult) printf("f %d,s %d",fresult,sresult);<br /> }<br />为什么语句(1),(2)执行出来的结果不一样,请高手指点,问题在什么地方!<br /> <br /> <br />
个人见解
整数在存储器中以8421的顺序排列,所以正整数的不溢出和等次幂的乘除法结果一样,整数考虑移位扩展位时和等次幂的乘除法结果也一样,但是浮点数表示的方法不同于整数,因此移位和乘除法的结果不一样,看看IEEE754浮点数标准就晓得了一个极其怪的问题!
zgl7903:<br />谢谢,这个道理我明白了,但是如果我要把浮点运算转化成定点运算,该如何办呢,<br />浮点运算如下:<br /> fw0=5625636.482914;<br /> fw1=16796184.027028;<br /> fw2=-16716106.802805;<br /> fw3=5545557.1237500 ;<br /> fw=1.0-((fw1+fw2+fw3)/fw0); <br /> float w=w=w=in_data;(in_data[] 是unsigned char数据)<br /> <br /> for(i=0;i<n;i++)<br /> {<br /> float x=in_data;<br /><br /> float sresult=(float)(fw*x + <br /> (fw1*w+fw1*w+fw2*w)/fw0) ;<br /> <br /> w=w;<br /> w=w;<br /> w=sresult;<br /> <br /> }<br /><br />浮点转定点运算:<br /><br /> fw0=5625636.482914;<br /> fw1=16796184.027028;<br /> fw2=-16716106.802805;<br /> fw3=5545557.1237500 ;<br /> fw=1.0-((fw1+fw2+fw3)/fw0); <br /> sw0 =(int) ( fw1/fw0 * 1024*1024 ); //11Q20<br /> sw1 =(int) ( fw2/fw0 * 1024*1024); <br /> sw2 = (int)( fw3/fw0 * 1024*1024); <br /> sw = fw* 1024*1024 ; <br /> int w=w=w=in_data;<br /><br /> for(i=0;i<n;i++)<br /> {<br /> int x=in_data;<br /> ////////////////////////////////////////////////////////<br /> int sresult=(int)((sw*x + sw0*w+sw1*w+sw2*w)/1048576) ;<br /> ////////////////////////////////////////////////////////<br /> w=w;<br /> w=w;<br /> w=sresult;<br /> <br /> }<br /><br />经过我DEBUG发现,定点运算的数据精度有损失是合理的,但是滤波出来的数据规律有问题,比如输入数据是1,2,3,4,5..........254,255;浮点运算后的输出数据基本是平滑的,但是定点运算后发现输出数据有周期性变化 如:1,2,3,4,5,6,8,9,10, 7,9,9,10, 15,16,17,18,19,20, 14,15,16, 24,25,26,27,........等等类似的情况,想不明白了!请高手指教,<br />这本质就是要实现一个滤波算法,但是要把浮点运算转化为定点运算,看了这方面的资料,根据这些资料改写了算法,但是就出现这样的结果,郁闷!!!!求救!!<br /><br />浮点转定点运算:
没有指点,自己顶一下!!!1short型的数据范围是多少?
Q20 至少是20位的数据长度 是不是数据溢出了呢浮点转定点运算
改成int 类型还是有问题!!!!!!!!!!!!!!!!!!!!!!!!<br />浮点转定点运算:<br /><br /> fw0=5625636.482914;<br /> fw1=16796184.027028;<br /> fw2=-16716106.802805;<br /> fw3=5545557.1237500 ;<br /> fw=1.0-((fw1+fw2+fw3)/fw0); <br /> sw0 =(int) ( fw1/fw0 * 1024*1024 ); //11Q20<br /> sw1 =(int) ( fw2/fw0 * 1024*1024); <br /> sw2 = (int)( fw3/fw0 * 1024*1024); <br /> sw = fw* 1024*1024 ; <br /> int w=w=w=in_data;<br /><br /> for(i=0;i<n;i++)<br /> {<br /> int x=in_data;<br /> ////////////////////////////////////////////////////////<br /> int sresult=(int)((sw*x + sw0*w+sw1*w+sw2*w)/1048576) ;<br /> ////////////////////////////////////////////////////////<br /> w=w;<br /> w=w;<br /> w=sresult;<br /> <br /> }<br />输入的数据是0-255之间,int 32Bit,short 16 bit,我用的是TMS320C6414一个极其怪的问题!
还是没有人给些建议,请高手指点一二!万分感谢!!!!!!!!!!!!!!!!看看sizeof(int)是多少?
看看sizeof(int)是多少?
int 已经确定是32 位的!在PC机上调试跟踪一圈,看看和你的理论上差在哪里
页:
[1]