天天看點

matlab中的eps功能

最近在學習MATLAB,中間在做矩陣的除法時,發現後面加了個eps,按照以往經驗,不加eps就可以了,感覺很疑惑,是以查詢了一下。

使用help eps得到了:

EPS  Spacing of floating point numbers.

    D = EPS(X), is the positive distance from ABS(X) to the next larger in

    magnitude floating point number of the same precision as X.

    X may be either double precision or single precision.

    For all X, EPS(X) = EPS(-X) = EPS(ABS(X)).

    EPS, with no arguments, is the distance from 1.0 to the next larger double

    precision number, that is EPS = 2^(-52).

也就是eps表征的是浮點數的間隔值。

EPS(X)表示的是 ABS(X)到下一個更大的浮點數之間的間隔(因為浮點數是間斷的,不連續)。而且EPS(X) = EPS(-X) = EPS(ABS(X)),都是X的絕對值到下一個浮點數的間隔長度。

不帶參數的 EPS,是從1開始到下一個比原值大的浮點數與原值的距離。我的了解是這是一個随原值變化的精度。比如a+eps,如果a為浮點數,則a+eps==a;如果a在兩個浮點數之間,則取比a大的那個浮點數替代。a+eps>a.(如果不加eps,可能結果就是通過四舍五入的原則選擇離a近的浮點數)。

我設定以下函數:

[a,b]=meshgrid(-2:.5:2);

c=sqrt(a.^2+b.^2)+eps;

d=sqrt(a.^2+b.^2);

e=find(c~=d);

f=[c(e(1)),c(e(2)),c(e(3)),c(e(4)),c(e(5)),c(e(6)),c(e(7)),c(e(8)),c(e(9))];

g=[d(e(1)),d(e(2)),d(e(3)),d(e(4)),d(e(5)),d(e(6)),d(e(7)),d(e(8)),d(e(9))];

h=[f;g]

得到:h =

    2.8284    2.0616    2.0616    2.8284    2.1213    1.8028    1.5811    1.5000    1.5811

    2.8284    2.0616    2.0616    2.8284    2.1213    1.8028    1.5811    1.5000    1.5811

可以看到,在尋找的c與d的不同元素的結果卻是一樣的數值。但是:

j=c<d

j =

     0     0     0     0     0     0     0     0     0

     0     0     0     0     0     0     0     0     0

     0     0     0     0     0     0     0     0     0

     0     0     0     0     0     0     0     0     0

     0     0     0     0     0     0     0     0     0

     0     0     0     0     0     0     0     0     0

     0     0     0     0     0     0     0     0     0

     0     0     0     0     0     0     0     0     0

     0     0     0     0     0     0     0     0     0

>> 

>> i=c>d

i =

     1     0     0     1     0     1     0     0     1

     0     1     1     1     1     1     1     1     0

     0     1     1     1     1     1     1     1     0

     1     1     1     1     1     1     1     1     1

     0     1     1     1     1     1     1     1     0

     1     1     1     1     1     1     1     1     1

     0     1     1     1     1     1     1     1     0

     0     1     1     1     1     1     1     1     0

     1     0     0     1     0     1     0     0     1

我們可以發現,c一定大于或等于d。雖然呈現的結果上看不出來,但是計算系統卻能辨識出來。是以a+eps>=a.是以a+eps是取了離a最近的最大的那個浮點數。這也告訴我們

,眼見的不一定是事實。附上c和d,可以對比下(數值上都一樣):

c =

    2.8284    2.5000    2.2361    2.0616    2.0000    2.0616    2.2361    2.5000    2.8284

    2.5000    2.1213    1.8028    1.5811    1.5000    1.5811    1.8028    2.1213    2.5000

    2.2361    1.8028    1.4142    1.1180    1.0000    1.1180    1.4142    1.8028    2.2361

    2.0616    1.5811    1.1180    0.7071    0.5000    0.7071    1.1180    1.5811    2.0616

    2.0000    1.5000    1.0000    0.5000    0.0000    0.5000    1.0000    1.5000    2.0000

    2.0616    1.5811    1.1180    0.7071    0.5000    0.7071    1.1180    1.5811    2.0616

    2.2361    1.8028    1.4142    1.1180    1.0000    1.1180    1.4142    1.8028    2.2361

    2.5000    2.1213    1.8028    1.5811    1.5000    1.5811    1.8028    2.1213    2.5000

    2.8284    2.5000    2.2361    2.0616    2.0000    2.0616    2.2361    2.5000    2.8284

>> d

d =

    2.8284    2.5000    2.2361    2.0616    2.0000    2.0616    2.2361    2.5000    2.8284

    2.5000    2.1213    1.8028    1.5811    1.5000    1.5811    1.8028    2.1213    2.5000

    2.2361    1.8028    1.4142    1.1180    1.0000    1.1180    1.4142    1.8028    2.2361

    2.0616    1.5811    1.1180    0.7071    0.5000    0.7071    1.1180    1.5811    2.0616

    2.0000    1.5000    1.0000    0.5000         0    0.5000    1.0000    1.5000    2.0000

    2.0616    1.5811    1.1180    0.7071    0.5000    0.7071    1.1180    1.5811    2.0616

    2.2361    1.8028    1.4142    1.1180    1.0000    1.1180    1.4142    1.8028    2.2361

    2.5000    2.1213    1.8028    1.5811    1.5000    1.5811    1.8028    2.1213    2.5000

    2.8284    2.5000    2.2361    2.0616    2.0000    2.0616    2.2361    2.5000    2.8284