- 积分
- 27652
- 贡献
-
- 精华
- 在线时间
- 小时
- 注册时间
- 2014-4-25
- 最后登录
- 1970-1-1
|
发表于 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。这个技巧可以帮助估计不熟悉机器的舍入误差级别——而现在的作用是拿来直观地说明舍入误差的存在。 |
评分
-
查看全部评分
|