MATLAB中文论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1580|回复: 2|关注: 1

[已答复] MATLAB 浮点运算中一个奇怪的现象

[复制链接]

论坛优秀回答者

24

主题

1万

帖子

1633

最佳答案
  • 关注者: 666
发表于 2015-1-6 23:24:00 | 显示全部楼层 |阅读模式
本帖最后由 winner245 于 2015-1-6 23:26 编辑

最近在调试代码的过程中观察到一个奇怪的现象,为了还原这一现象,特地将问题简化为如下代码:
a = rand(1,3);
b = a + eps(a);
a == b
显然,ab 的每个元算值都相差一个很小的eps值,故a == b 判断的结果为 0 0 0

下面我们来通过工作空间(workspace)查看ab高位有效数字。双击工作空间中的ab变量后,ab数组将以默认的short型显示在Variables窗口。在Variables窗口中进一步双击a(1) b(1)可以查看更高位的有效数字(注意,问题就出现在这里,一定要同时双击ab数组的同一元素),这时,奇怪的现象发生了,a== b 的判断结果突然变成了 1 0 0。如果继续逐一双击ab数组相同位置的其他元素,我们最终会发现 a==b判断的结果为 1 1 1

仔细观察发现,在我们双击了Variables窗口中的变量值时,一旦移开鼠标去响应其他事件,该变量值便会自动以刚才Variables窗口中显示的数值来保存,造成浮点数有效数字的截断。由于ab差值仅为eps,当二者均发生截断误差后也就变得相等了。

同样的,下述代码
a = rand(1,3);
aa = a;
a == aa
结果为1 1 1。如果我们在Variables窗口中只双击查看a(1)的数值后(注意,不要查看aa),再运行a==aa,将得到0 1 1

以上现象说明在Variables窗口双击查看变量的过程会令变量自动以显示的数值保存,对于浮点数可能会造成截断误差,不过这个误差很小,绝大多数情况是可以忽略不计的。不知大伙有没有注意到这个现象?如果我的上述分析有误,也欢迎指正,谢谢

论坛优秀回答者

1

主题

9782

帖子

1463

最佳答案
  • 关注者: 267
发表于 2015-1-7 05:46:17 | 显示全部楼层
我认为你的分析是正确的,matlab将这个操作视为用户编辑变量值,matlab的帮助中说:
Edit the value of an array element by clicking the element, and then typing a new value. Press Enter, or click another element.
所以并不需要按Enter便会对编辑过的值进行保存

论坛优秀回答者

24

主题

1万

帖子

1633

最佳答案
  • 关注者: 666
 楼主| 发表于 2015-1-7 06:12:14 | 显示全部楼层
本帖最后由 winner245 于 2015-1-7 06:13 编辑
kaaaf123 发表于 2015-1-7 05:46
我认为你的分析是正确的,matlab将这个操作视为用户编辑变量值,matlab的帮助中说:
Edit the value of an  ...

嗯,谢谢你的核实,确实如此,顺便附上help文档链接以供参考 http://www.mathworks.com/help/ma ... copy-variables.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /2 下一条

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