查看完整版本 : [求助]简单的程序,诡异的结果。请高手们看一下。
cleverliu
2008-12-14, 05:44
deadrate=0.90
for i=1:2
if (deadrate==0.9500)||(deadrate==0.9)
deadrate = deadrate+0.0500
else
deadrate = deadrate+0.1
end
end
正确结果应该是1,但是程序运行的结果是1.05。很奇怪,不知道为什么??
mathjiang
2008-12-14, 09:37
的确奇怪,除了误差这个原因外没别法解释。
debateshang
2008-12-14, 13:10
deadrate=0.90
for i=1:2
if (deadrate==0.9500)||(deadrate==0.9)
deadrate = deadrate+0.0500
else
deadrate = deadrate+0.1
end
end
正确...
你这个不是循环两次吗,第一次的时候 deadrate已经是0.95了所以在进行判断的时候执行else命令
那不是0.95+0.1么正好是1.05呀;
如果你把i=1:100最后结果还是10.8500呢,这不是什么误差的问题,只是你的程序你没有完全明白
zhoumath
2008-12-17, 14:44
我感觉也应该是1.0啊,虽然第一次循环的结果是0.9500,当时第二次循环时间仍然满足if的条件啊!为什么运行的是else语句呢?
为什么正确结果是1呢???
应该是1.05啊。0.05>eps
所以应该是0.9+0.05+0.1啊
三楼正解。for语句循环两次,第一次进入if,第二次进入else.最后是1.05.如果lz要达到期望结果,需要break for循环。
mathjiang
2009-01-02, 17:47
关键是第二次为什么进入else?
这个没有人说明白了。
mathjiang
2009-01-02, 17:48
进入else的唯一原因就是matlab计算误差问题。
lingyun422
2009-01-02, 22:35
自问没有明白为什么第二次判断时条件式为什么为假了?
在对任何双精度进行相等比较时,因该注意这样写 :abs(y1-y2)<eps;应为双精度存储不是准确的,只是近似值。该程序中,可以加入一句:s1=deadrate-0.9500,在fomat long 情况下可以看到第二次循环计算为1.1102e-016 :lol:
ziliang454618
2009-01-03, 09:08
clc;clear all;
deadrate=0.9;
for i=1:2
i
deadrate
t1=abs(deadrate-0.95)<=eps
t2=abs(deadrate-0.9)<=eps
if t1 || t2
disp('||')
deadrate = deadrate+0.0500
else
disp('else')
deadrate = deadrate+0.1
end
end
楼主犯了编码的大忌:对浮点数做相等比较。在计算机里面由于字长的限制,浮点数通常都是不精确的,例如,0.95只是理论上的值,在计算机里面表示的真实值其实可能是0.9499999这样的数字。而0.05可能也会表达成0.049999995这样的数字。所以,这种情况下做浮点数相等比较,特别是经过预算后的浮点变量与浮点常数做相等比较,出错的概率会很大的。所以一般都会采用abs(x-y) < eps这样的方法才能得到期望的结果。
coffietree
2009-01-03, 15:07
学习了。谢谢了。
vBulletin® v3.8.3,版权所有 ©2000-2025,Jelsoft Enterprises Ltd.