本帖最后由 winner245 于 2015-1-6 23:26 编辑 最近在调试代码的过程中观察到一个奇怪的现象,为了还原这一现象,特地将问题简化为如下代码: a = rand(1,3);b = a + eps(a); a == b 显然,a、b 的每个元算值都相差一个很小的eps值,故a == b 判断的结果为 0 0 0。 下面我们来通过工作空间(workspace)查看a、b高位有效数字。双击工作空间中的a、b变量后,a、b数组将以默认的short型显示在Variables窗口。在Variables窗口中进一步双击a(1) 和 b(1)可以查看更高位的有效数字(注意,问题就出现在这里,一定要同时双击a、b数组的同一元素),这时,奇怪的现象发生了,a== b 的判断结果突然变成了 1 0 0。如果继续逐一双击a、b数组相同位置的其他元素,我们最终会发现 a==b判断的结果为 1 1 1。 仔细观察发现,在我们双击了Variables窗口中的变量值时,一旦移开鼠标去响应其他事件,该变量值便会自动以刚才Variables窗口中显示的数值来保存,造成浮点数有效数字的截断。由于a、b差值仅为eps,当二者均发生截断误差后也就变得相等了。 同样的,下述代码 a = rand(1,3); aa = a; a == aa 结果为1 1 1。如果我们在Variables窗口中只双击查看a(1)的数值后(注意,不要查看aa),再运行a==aa,将得到0 1 1。 以上现象说明在Variables窗口双击查看变量的过程会令变量自动以显示的数值保存,对于浮点数可能会造成截断误差,不过这个误差很小,绝大多数情况是可以忽略不计的。不知大伙有没有注意到这个现象?如果我的上述分析有误,也欢迎指正,谢谢 |
2 条回复