声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1769|回复: 8

[编程技巧] while循环的小程序也会出错?各位帮忙看看!

[复制链接]
发表于 2006-10-9 19:18 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
因为检验程序需要,特写了一段计数器程序,本来觉得很简单的问题,但是while循环体出来的结果就是不对。大家来看下:

i = 0.1; %循环变量初值
n = 1; %计数器

%for i=0.1:0.1:7.0
while (i <7.0)
    y(n,1) = i
    i=i+0.1;
    n=n+1
end

但是出来的结果是:

    6.8000
    6.9000
    7.0000
n = 71
而不是在6.9时就停止。
当我把运算变为长精度时,结果是:
  5.80000000000000
   5.90000000000000
   5.99999999999999
   6.09999999999999
   6.19999999999999
   6.29999999999999
   6.39999999999999
   6.49999999999999
   6.59999999999999
   6.69999999999999
   6.79999999999999
   6.89999999999999
   6.99999999999999
n = 71
我怀疑两个反应的是同一个问题。即使表现形式不太一样。
当然我可以直接改用for循环,但是我还是想知道while出现这种情况是怎么回事呢?

评分

1

查看全部评分

回复
分享到:

使用道具 举报

发表于 2006-10-9 19:46 | 显示全部楼层
我觉得正确的就是7.0呀
6.9满足i <7.0
所以i=i+0.1;
i=7.0 不满足条件,循环结束
发表于 2006-10-9 20:47 | 显示全部楼层
原帖由 jimin 于 2006-10-9 19:46 发表
我觉得正确的就是7.0呀
6.9满足i <7.0
所以i=i+0.1;
i=7.0 不满足条件,循环结束



正解,楼主补补编程基础吧
 楼主| 发表于 2006-10-9 21:25 | 显示全部楼层
楼上两位:既然 i=7.0时不满足条件了,怎么会执行下面的:y(n,1) = i,从而把7.0这个数输出呢?
发表于 2006-10-9 21:48 | 显示全部楼层
原帖由 sissigong 于 2006-10-9 21:25 发表
楼上两位:既然 i=7.0时不满足条件了,怎么会执行下面的:y(n,1) = i,从而把7.0这个数输出呢?



试了一下,果然如此,呵呵。这个可能是“<”运算符的精度问题引起的(而“:”运算符则不会出现类似的问题),循环变量最好还是用uint型的吧,尽量避免用浮点类型。
发表于 2006-10-9 22:26 | 显示全部楼层
关于浮点算数的精度问题,我给出一个例子
x=0.988:0.0001:1.012;
y1=x.^7-7*x.^6+21*x.^5-35*x.^4+35*x.^3-21*x.^2+7*x-1;
y2=(x-1).^7;
subplot(2,1,1)
plot(x,y1)
subplot(2,1,2)
plot(x,y2)

y1 就是将多项式y2展开,y1非常不光滑,完全不象一个多项式,原因就是舍人误差在起作用

[ 本帖最后由 jimin 于 2006-10-9 22:30 编辑 ]

111

111

评分

1

查看全部评分

发表于 2006-10-10 09:14 | 显示全部楼层
我也碰到过舍入误差的问题,但楼主的这个例子既简单又能说明问题。

唉,要怎么避免呢?都不相信MATLAB了,呵呵。
发表于 2006-10-10 09:25 | 显示全部楼层
原帖由 jimin 于 2006-10-9 22:26 发表
关于浮点算数的精度问题,我给出一个例子
x=0.988:0.0001:1.012;
y1=x.^7-7*x.^6+21*x.^5-35*x.^4+35*x.^3-21*x.^2+7*x-1;
y2=(x-1).^7;
subplot(2,1,1)
plot(x,y1)
subplot(2,1,2)
plot(x,y2)

y ...

例子很能说明浮点数和整数的区别了。
 楼主| 发表于 2006-10-10 21:42 | 显示全部楼层
恩,这个例子的确很能表达问题,如果必须要使用浮点型的话,怎么办呢?
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-12 17:07 , Processed in 0.087122 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表