如何在MATLAB中计算eps()?

时间:2017-01-26 22:41:29

标签: matlab language-agnostic bit-manipulation precision

MATLAB中的eps例程实质上返回浮点数之间的正距离。它也可以采用可选参数。

我的问题:MATLAB如何计算这个值? (它是使用查找表,还是使用某种算法在运行时计算它,或其他什么......?)

相关:在给定浮点数的情况下,如何在提供位访问的任何语言中计算?

3 个答案:

答案 0 :(得分:6)

WIkipedia has quite the page on it

特别是对于MATLAB,它是2 ^( - 53),因为MATLAB默认使用双精度。这是图表: enter image description here 它是符号的一位,指数为11,其余为分数。

MATLAB documentation on floating point numbers也表明了这一点。

  

d = eps(x),其中x的数据类型为single或double,返回从abs(x)到下一个与x精度相同的较大浮点数的正距离。

由于并非所有分数在数字线上的间距相等,因此不同分数将在相同精度内显示到下一个浮点的不同距离。他们的位代表是:

1.0 = 0 01111111111 0000000000000000000000000000000000000000000000000000
0.9 = 0 01111111110 1100110011001100110011001100110011001100110011001101

两者的符号都是正数(0),指数不相等,当然它们的分数差别很大。这意味着下一个浮点数将是:

dec2bin(typecast(eps(1.0), 'uint64'), 64) = 0 01111001011 0000000000000000000000000000000000000000000000000000
dec2bin(typecast(eps(0.9), 'uint64'), 64) = 0 01111001010 0000000000000000000000000000000000000000000000000000

不一样,因此eps(0.9)~=eps(1.0)

答案 1 :(得分:3)

以下是对eps的一些见解,它将帮助您编写算法。

eps(1) = 2^(-52)。现在,假设您要计算eps的{​​{1}}。请注意,我选择了17179869183.9小于0.1的数字(换句话说,类似2^34)。要计算此2^(33.9999...),您可以计算数字的eps,如前所述,这将是〜log2。获取此33.99999...这个数字,并将其添加到floor(),因为-52和给定的数字eps(1) = 2^(-52)。因此,2^(33.999...)

如果你取一个小于2 ^ 34的数字,例如eps(17179869183.9) = -52+33 = -19,那么log2(eps(17179869184.1。)这也表明17179869184.1)) = -18值会改变对于作为你的基数(或基数)的整数幂的数字,在这种情况下2.由于eps值仅在整数幂为2的数字上发生变化,我们取eps幂。对于任何使用此数字的数字,您都可以获得floor的完美价值。我希望它很清楚。

答案 2 :(得分:1)

MATLAB使用(以及其他语言)IEEE754标准来表示实际浮点数。

在这种格式中,为近似实际 1 实数而分配的位,通常为32 - 对于单精度或64 - 对于双精度,分组为:3组

  • 1位用于确定标志,s。
  • 指数的8位(或11位),e。
  • 分数的23(或52)位,f。

然后一个实数n用近似的三项 - 关系近似:

n =( - 1) s * 2 (e - 偏差) *(1 +分数)

其中bias负偏移 2 指数的值,以便它们描述0到1 /(1和2)之间的数字。

现在,这个差距反映了这样一个事实,即实数并不能完美地映射到它们的有限的32位或64位表示,此外,还有一系列实数与abs值相差< eps映射到计算机内存中的单个值,即:如果将值val分配给变量var_i

  

var_1 = val - 偏移
  ...
  var_i = val;
  ...
  val_n = val + offset

,其中

  

偏移&lt; eps(val)/ 2

然后:

  

var_1 = var_2 = ... = var_i = ... = var_n。

差距由包含指数(或特征)的第二项确定:

2 (e - 偏差)

在上述关系 3 中,它决定了近似数字所在的“line”“scale”,数字越大,它们之间的距离越大,它们的精确度就越小,反之亦然:数字越小,表示的位置越密集,因此越准确。

在实践中,要确定特定数字eps(number)的差距,您可以先添加/减去逐渐增加的小数,直到兴趣数的初始值发生变化 - 这会给您带来差距在那个(正面或负面)方向,即eps(number) / 2

要检查MATLAB的eps(或ULP - 最后一个单位的可能实现,因为它在其他语言中调用),您可以搜索C,C ++或Java中的ULP实现,这些是语言MATLAB是用。

编写的

1。实数是无限精确的,即它们可以以任意精度写入,即小数点后的任意位数。

2。通常在一半左右:单精度8位表示从1到2 ^ 8 = 256的十进制值,在我们的情况下大约一半是:127,即2 (e-127)

2。可以认为:2 (e - bias),表示数字的最高有效数字,即有助于描述数字有多大的数字,而不是最低有效数字有助于描述其精确位置。那么包含指数的项越大,该分数的23位的重要性就越小。