matlab中的eps功能
2015-10-16 17:55
477 查看
最近在学习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
使用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
相关文章推荐
- 解析在main函数之前调用函数以及对设计的作用详解
- java和matlab画多边形闭合折线图示例讲解
- C#调用Matlab生成的dll方法的详细说明
- 从java中调用matlab详细介绍
- VC++与Matlab混合编程的快速实现
- Matlab 矩阵运算
- matlab与opencv部分函数的对照
- matlab神经网络工具箱创建神经网络
- Matlab
- MATLAB 入门教程
- matlab函数_连通区域
- MATLAB中函数模式和命令模式的区别
- MATLAB 添加自定义的模块到simulink库浏览器
- MATLAB for Mac使编辑器支持中文
- [转]matlab中plot用法
- 初学数模-MATLAB Quick Start! Part I
- 初学数模-MATLAB Quick Start! Part II
- matlab程序优化以及eclipse与github的结合
- matlab中的rand函数(用于产生随机数)
- 图像增强算法四种,图示与源码,包括retinex(ssr、msr、msrcr)和一种混合算法