MATLAB中的eps
例程实质上返回浮点数之间的正距离。它也可以采用可选参数。
我的问题:MATLAB如何计算这个值? (它是使用查找表,还是使用某种算法在运行时计算它,或其他什么......?)
相关:在给定浮点数的情况下,如何在提供位访问的任何语言中计算?
答案 0 :(得分:6)
WIkipedia has quite the page on it
特别是对于MATLAB,它是2 ^( - 53),因为MATLAB默认使用双精度。这是图表: 它是符号的一位,指数为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组
然后一个实数n用近似的三项 - 关系近似:
其中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。
差距由包含指数(或特征)的第二项确定:
在上述关系 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位的重要性就越小。