爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 12979|回复: 4

[讨论] 关于matlab find计算时出现的bug

[复制链接]

新浪微博达人勋

发表于 2021-8-27 17:51:14 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
本帖最后由 trz 于 2021-8-27 17:57 编辑

这个问题如图所示,版本是2020a,我是写画图程序时发现find找不到 0.87micro meter,就很奇怪,卡了我一下午的时间
后来我用round去保留波长小数点后三位,就可以找到0.87了,有没有遇到这种情况的大佬解释一下,就很淦!!!!
Ps: 更有意思的是 0.875 0.675 都能找到,就这一个数找不到
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2021-8-27 17:53:22 | 显示全部楼层
C:\Users\Trz\Desktop\捕获.PNG
捕获.PNG
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2021-8-27 18:36:25 | 显示全部楼层
本帖最后由 伽蓝鸟 于 2021-8-27 18:41 编辑

我用的MATLAB2016b,试了下的确是这样的。
一个很好的问题。
我猜,是浮点数体系的问题。
MATLAB用的是IEEE的双精度格式,machine epsilon应该是2^(-52),换算到十进制里大概是2.2204e-16。
可以命令窗口输入eps,来看你的MATLAB里machine epsilon是多少,应该也是这个数。
eps/2或者eps通常被称为舍入误差级别。当一个计算结果用最接近的浮点数来近似时,可能造成的最大相对误差为eps/2,而两个浮点数的最大相对间距为eps。
来看你的例子,输入w1(115)-0.87。会有ans =  -1.1102e-16。这正好是-eps/2。所以找不到0.87这个数字,应该是舍入误差的问题?
  
我给出的建议是,别用等于号来判断,可以这样写:
find((abs(w1-0.87)<eps));或者find((abs(w1-0.87)<0.001))之类的,反正0.001小于你的步长。
毕竟,在MATLAB来判断浮点数是否相等,有时候是一个很微妙的事情。
  
在使用IEEE标准之前,不同机器的eps差异很大。一个很老套,但现在基本没啥用的查看eps技巧。
让你的MATLAB或者其他啥东西算一下3*(4/3-1)-1,这东西手算的话肯定是0,但是因为舍入误差不会恰好是零。我这里显示的是-2.2204e-16,也就是-eps。这个技巧可以帮助估计不熟悉机器的舍入误差级别——而现在的作用是拿来直观地说明舍入误差的存在。

评分

参与人数 1金钱 +20 收起 理由
trz + 20 很给力!

查看全部评分

密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2021-8-27 18:45:59 | 显示全部楼层
伽蓝鸟 发表于 2021-8-27 18:36
我用的MATLAB2016b,试了下的确是这样的。
一个很好的问题。
我猜,是浮点数体系的问题。

谢谢大佬,搞明白了,我之前的处理是利用round函数对数组小数点后三位取整,也可以达到相同的结果
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2021-8-28 07:44:22 | 显示全部楼层
感谢,之前也遇到过相同的问题。
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

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