pdm97 发表于 2008-4-21 21:35

一个极其怪的问题!

一个极其怪的问题!&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;fw0=5625636.482914;<br />&nbsp;&nbsp;&nbsp;fw1=16796184.027028;<br />&nbsp;&nbsp;&nbsp;fw2=-16716106.802805;<br />&nbsp;&nbsp;&nbsp;fw3=5545557.1237500&nbsp;;<br />&nbsp;&nbsp;&nbsp;fw=1.0-((fw1+fw2+fw3)/fw0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;sw0&nbsp;=(short)&nbsp;(&nbsp;fw1/fw0&nbsp;*&nbsp;8192&nbsp;&nbsp;);&nbsp;//Q13<br />&nbsp;&nbsp;&nbsp;sw1&nbsp;=(short)&nbsp;(&nbsp;fw2/fw0&nbsp;*&nbsp;8192&nbsp;);&nbsp;&nbsp;//Q13<br />&nbsp;&nbsp;&nbsp;sw2&nbsp;=&nbsp;(short)(&nbsp;fw3/fw0&nbsp;*&nbsp;8192&nbsp;&nbsp;);&nbsp;//Q13<br />&nbsp;&nbsp;&nbsp;w=w=w=in_data;<br />&nbsp;&nbsp;&nbsp;fwf=fwf=fwf=in_data;<br /><br />for(i=0;i&ltn;i++)<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x=in_data;<br /><br />(1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sresult=(short)(x&nbsp;+&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((sw0*(w-x)+sw1*(w-x)+sw2*(w-x))&nbsp;&nbsp;&gt&gt13)&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;////////////////////////////////////////////////////////<br />(2)&nbsp;&nbsp;&nbsp;&nbsp;sresult=(short)(x&nbsp;+&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((sw0*(w-x)+sw1*(w-x)+sw2*(w-x))/8192)&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;////////////////////////////////////////////////////////<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;w=w;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;w=w;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;w=sresult;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(fresult!=sresult)&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;f&nbsp;%d,s&nbsp;%d
&quot;,fresult,sresult);<br />&nbsp;&nbsp;&nbsp;}<br />为什么语句(1),(2)执行出来的结果不一样,请高手指点,问题在什么地方!<br />&nbsp;<br />&nbsp;<br />

zgl7903 发表于 2008-4-22 08:58

个人见解

整数在存储器中以8421的顺序排列,所以正整数的不溢出和等次幂的乘除法结果一样,整数考虑移位扩展位时和等次幂的乘除法结果也一样,但是浮点数表示的方法不同于整数,因此移位和乘除法的结果不一样,看看IEEE754浮点数标准就晓得了

pdm97 发表于 2008-4-23 11:11

一个极其怪的问题!

zgl7903:<br />谢谢,这个道理我明白了,但是如果我要把浮点运算转化成定点运算,该如何办呢,<br />浮点运算如下:<br />&nbsp;&nbsp;&nbsp;fw0=5625636.482914;<br />&nbsp;&nbsp;&nbsp;fw1=16796184.027028;<br />&nbsp;&nbsp;&nbsp;fw2=-16716106.802805;<br />&nbsp;&nbsp;&nbsp;fw3=5545557.1237500&nbsp;;<br />&nbsp;&nbsp;&nbsp;fw=1.0-((fw1+fw2+fw3)/fw0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;float&nbsp;w=w=w=in_data;(in_data[]&nbsp;是unsigned&nbsp;char数据)<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;for(i=0;i&ltn;i++)<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;float&nbsp;x=in_data;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;float&nbsp;sresult=(float)(fw*x&nbsp;+&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(fw1*w+fw1*w+fw2*w)/fw0)&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;w=w;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;w=w;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;w=sresult;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;}<br /><br />浮点转定点运算:<br /><br />&nbsp;&nbsp;&nbsp;fw0=5625636.482914;<br />&nbsp;&nbsp;&nbsp;fw1=16796184.027028;<br />&nbsp;&nbsp;&nbsp;fw2=-16716106.802805;<br />&nbsp;&nbsp;&nbsp;fw3=5545557.1237500&nbsp;;<br />&nbsp;&nbsp;&nbsp;fw=1.0-((fw1+fw2+fw3)/fw0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;sw0&nbsp;=(int)&nbsp;(&nbsp;fw1/fw0&nbsp;*&nbsp;1024*1024&nbsp;&nbsp;);&nbsp;//11Q20<br />&nbsp;&nbsp;&nbsp;sw1&nbsp;=(int)&nbsp;(&nbsp;fw2/fw0&nbsp;*&nbsp;1024*1024);&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;sw2&nbsp;=&nbsp;(int)(&nbsp;fw3/fw0&nbsp;*&nbsp;1024*1024);&nbsp;<br />&nbsp;&nbsp;&nbsp;sw&nbsp;=&nbsp;fw*&nbsp;1024*1024&nbsp;;&nbsp;<br />&nbsp;&nbsp;&nbsp;int&nbsp;w=w=w=in_data;<br /><br />&nbsp;&nbsp;&nbsp;for(i=0;i&ltn;i++)<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;x=in_data;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;////////////////////////////////////////////////////////<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;sresult=(int)((sw*x&nbsp;+&nbsp;sw0*w+sw1*w+sw2*w)/1048576)&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;////////////////////////////////////////////////////////<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;w=w;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;w=w;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;w=sresult;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;}<br /><br />经过我DEBUG发现,定点运算的数据精度有损失是合理的,但是滤波出来的数据规律有问题,比如输入数据是1,2,3,4,5..........254,255;浮点运算后的输出数据基本是平滑的,但是定点运算后发现输出数据有周期性变化&nbsp;如:1,2,3,4,5,6,8,9,10,&nbsp;7,9,9,10,&nbsp;15,16,17,18,19,20,&nbsp;14,15,16,&nbsp;24,25,26,27,........等等类似的情况,想不明白了!请高手指教,<br />这本质就是要实现一个滤波算法,但是要把浮点运算转化为定点运算,看了这方面的资料,根据这些资料改写了算法,但是就出现这样的结果,郁闷!!!!求救!!<br /><br />

pdm97 发表于 2008-4-23 22:14

浮点转定点运算:

没有指点,自己顶一下!!!1

zgl7903 发表于 2008-4-24 14:07

short型的数据范围是多少?

Q20&nbsp;至少是20位的数据长度&nbsp;是不是数据溢出了呢

pdm97 发表于 2008-4-24 15:49

浮点转定点运算

改成int&nbsp;类型还是有问题!!!!!!!!!!!!!!!!!!!!!!!!<br />浮点转定点运算:<br /><br />&nbsp;&nbsp;&nbsp;fw0=5625636.482914;<br />&nbsp;&nbsp;&nbsp;fw1=16796184.027028;<br />&nbsp;&nbsp;&nbsp;fw2=-16716106.802805;<br />&nbsp;&nbsp;&nbsp;fw3=5545557.1237500&nbsp;;<br />&nbsp;&nbsp;&nbsp;fw=1.0-((fw1+fw2+fw3)/fw0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;sw0&nbsp;=(int)&nbsp;(&nbsp;fw1/fw0&nbsp;*&nbsp;1024*1024&nbsp;&nbsp;);&nbsp;//11Q20<br />&nbsp;&nbsp;&nbsp;sw1&nbsp;=(int)&nbsp;(&nbsp;fw2/fw0&nbsp;*&nbsp;1024*1024);&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;sw2&nbsp;=&nbsp;(int)(&nbsp;fw3/fw0&nbsp;*&nbsp;1024*1024);&nbsp;<br />&nbsp;&nbsp;&nbsp;sw&nbsp;=&nbsp;fw*&nbsp;1024*1024&nbsp;;&nbsp;<br />&nbsp;&nbsp;&nbsp;int&nbsp;w=w=w=in_data;<br /><br />&nbsp;&nbsp;&nbsp;for(i=0;i&ltn;i++)<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;x=in_data;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;////////////////////////////////////////////////////////<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;sresult=(int)((sw*x&nbsp;+&nbsp;sw0*w+sw1*w+sw2*w)/1048576)&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;////////////////////////////////////////////////////////<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;w=w;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;w=w;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;w=sresult;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;}<br />输入的数据是0-255之间,int&nbsp;32Bit,short&nbsp;16&nbsp;bit,我用的是TMS320C6414

pdm97 发表于 2008-4-27 10:20

一个极其怪的问题!

还是没有人给些建议,请高手指点一二!万分感谢!!!!!!!!!!!!!!!!

zgl7903 发表于 2008-4-29 18:11

看看sizeof(int)是多少?

pdm97 发表于 2008-4-29 19:42

看看sizeof(int)是多少?

int&nbsp;已经确定是32&nbsp;位的!

zgl7903 发表于 2008-4-30 15:10

在PC机上调试跟踪一圈,看看和你的理论上差在哪里

页: [1]
查看完整版本: 一个极其怪的问题!