qiqihainan 发表于 2006-5-12 17:50

求助:请帮我看看程序

<P>functions=ad(y,vcc)<BR>%   逐次逼近型ad转换器<BR>%   输入一个模拟电平可输出相应的数字表示<BR>s=0;<BR>t=vcc/2;<BR>t1=128;<BR>for i=1:8<BR>    t1=t1/2<BR>    z=y-t<BR>    if y&gt;t<BR>      s=s+(10^(8-i))*1<BR>      t=t+0.022*t1<BR>    elseif   y==t<BR>          s=s+(10^(8-i))*1<BR>          break<BR>   else<BR>          s=s+(10^(8-i))*0<BR>          t=t-0.022*t1<BR>      end<BR>end<BR>我在命令窗口输入ad(3.520.5.632)<BR>结果应为10100000 但出来的结果是100111111<BR>具体的调试结果显示<BR>t1 =</P>
<P>    64</P>
<P><BR>z =</P>
<P>    0.7040</P>
<P><BR>s =</P>
<P>    10000000</P>
<P><BR>t =</P>
<P>    4.2240</P>
<P><BR>t1 =</P>
<P>    32</P>
<P><BR>z =</P>
<P>   -0.7040</P>
<P><BR>s =</P>
<P>    10000000</P>
<P><BR><FONT color=#f70938>t =</FONT></P>
<P><FONT color=#f70938>    3.5200</FONT></P>
<P><BR><FONT color=#e61a42>t1 =</FONT></P>
<P><FONT color=#e61a42>    16</FONT></P>
<P><BR><FONT color=#e61a42>z =</FONT></P>
<P><FONT color=#e61a42> -4.4409e-016</FONT></P>
<P><BR><FONT color=#e61a42>s =</FONT></P>
<P><FONT color=#e61a42>    10000000</FONT></P>
<P><BR>t =</P>
<P>    3.1680</P>
<P><BR>t1 =</P>
<P>   8</P>
<P><BR>z =</P>
<P>    0.3520</P>
<P><BR>s =</P>
<P>    10010000</P>
<P><BR>t =</P>
<P>    3.3440</P>
<P><BR>t1 =</P>
<P>   4</P>
<P><BR>z =</P>
<P>    0.1760</P>
<P><BR>s =</P>
<P>    10011000</P>
<P><BR>t =</P>
<P>    3.4320</P>
<P><BR>t1 =</P>
<P>   2</P>
<P><BR>z =</P>
<P>    0.0880</P>
<P><BR>s =</P>
<P>    10011100</P>
<P><BR>t =</P>
<P>    3.4760</P>
<P><BR>t1 =</P>
<P>   1</P>
<P><BR>z =</P>
<P>    0.0440</P>
<P><BR>s =</P>
<P>    10011110</P>
<P><BR>t =</P>
<P>    3.4980</P>
<P><BR>t1 =</P>
<P>    0.5000</P>
<P><BR>z =</P>
<P>    0.0220</P>
<P><BR>s =</P>
<P>    10011111</P>
<P><BR>t =</P>
<P>    3.5090</P>
<P><BR>ans =</P>
<P>    10011111<BR>红字所标示的地方正是问题所在,此时y=3.520,t=3.520,即y=t但程序判断为y&lt;t.我设了个z变量z=y-t,发现此时的<FONT color=#e61a42>z =</FONT></P>
<P><FONT color=#e61a42> -4.4409e-016<BR>也就是t并不等于3.520而比这略大,按照我的算法初值t=5.632/2,t=t+0.022*t1循环到那一步时t=4.224-0.022*32=3.520应该刚好等于3.520,为什么计算机算出来比3.520大4.4409e-016。想不明白???<BR>正因为这小差别,我的结果就完全不同了<BR></FONT></P>

happy 发表于 2006-5-13 17:40

回复:(qiqihainan)求助:请帮我看看程序

elseif   y==t<BR><BR>这种表达式判断显然是非常不合适的<BR>由于误差的存在,虽然你现在看到的显示是一样的,但实际上t后边有一个很小的量,这个是由于阶段误差造成的。<BR><BR>改成<BR><BR>functions=ad(y,vcc)<BR>%   逐次逼近型ad转换器<BR>%   输入一个模拟电平可输出相应的数字表示<BR>s=0;<BR>t=vcc/2;<BR>t1=128;<BR>for i=1:8<BR>    t1=t1/2<BR>    z=y-t<BR>    if y&gt;t+1e-6<BR>      s=s+(10^(8-i))*1<BR>      t=t+0.022*t1<BR>    elseif   abs(y-t)&lt;=1e-6<BR>          s=s+(10^(8-i))*1<BR>          break<BR>   else<BR>          s=s+(10^(8-i))*0<BR>          t=t-0.022*t1<BR>      end<BR>end

qiqihainan 发表于 2006-5-15 09:55

谢谢happy

<P>我想问一下matlab程序都不能使用y==t这种判断条件吗</P>

qiqihainan 发表于 2006-5-15 10:20

如何显示数字前面的0

我做的是八位ad转换,比如说转换的结果是00111101 ,但计算机只显示111101<BR>还如何让前面的0也显示出来
页: [1]
查看完整版本: 求助:请帮我看看程序