matlab 中 eps 的分析

eps(a)是|a|与大于|a|的最小的浮点数之间的距离,距离越小表示精度越高。默认a=1:

这里直接在matlab中输入:eps == eps(1)(true).
我们知道浮点数其实是离散的,有限的,而且间隔是不均匀的。我们可以说一个数旁边的数是什么,
而它们之间的距离就反应了其精度。越靠近0,数和数之间就越密集,精度就越高。

下面引用百度知道中 greatdju 的详细回答:

首先,eps不是matlab所能表示的最小的正数。可以试试eps和eps/2,如果eps真的是最小的正数,

那么eps/2就应该四舍五入到0或eps,但实际上却能精确表示出来。正确的说法是eps=eps(1),是1的精度。

也就是说matlab无法表示介于1和1+eps之间的数,这些数将被四舍五入到1或1+eps。比如1+0.3*eps被舍入到1,

而1+0.7*eps被舍入到1+eps。可以用下面的语句进行验证:

1+0.3*eps==1%true

1+0.7*eps==1%false

1+0.7*eps==1+eps%true

正如前面所说,对浮点数而言,越靠近0,精度就越高。因此2的精度就比1的精度要低。

事实上,matlab无法区分介于2和2+2*eps之间的数。也就是说eps(2)=2*eps,下面是验证:

2+eps==2%true,说明matlab无法区分2和2+eps

1+eps==1%false,说明matlab可以区分1和1+eps,因此1的精度比2高

0的精度是最高的,也就是说eps(0)才是matlab所能表示的最小的正数。它和eps相比相差了300多个数量级

eps和它相比大的简直是个天文数字。 好了看了上面的分析应该知道怎么回事了,不过知道了eps是什么,但是对于为什么精度这样变化,我提出我的理解:

这里的精度跟数字在电脑的存储方式有关,计算机的存储位数是一定的,可是表示 1 只要一位,表示 2 要两位数,

比如:eps(2)==eps(3) %true; 另外:eps(4) = eps(7) != eps(8)...

对照上边的例子:2+eps==2%true 而 2 + eps(2) == 2 %false...这里不写太多例子了,分析下这个例子,

第一个eps默认为eps(1)加上2以后,由于表示的位数限制,不能表示到eps(1)的精度,所以小数部分直接溢出

了,而第二个等式在表示精度范围内所以小数部分不会略去,还不懂的话,我再给大家看一下:

   3 + eps(2) == 3 %false; 4 + eps(2) == 4 %ture.....不知道懂了没有,自己再体会一下。。。
上一篇:java排序算法(八):希尔排序(shell排序)


下一篇:tmux protocol version mismatch (client 7, server 6)