eps 返回从 1.0 到下一个最大 double 字的距离,因此我可以用它来解释负权重位置上的数字值。但是对于在高正权重位置具有值(value)的非常大的数字,我可以用什么来解释?
我的意思是我需要一些引用来计算 Matlab 上获得的数字的计算噪声。
最佳答案
你读过"What Every Computer Scientist Should Know About Floating-Point Arithmetic"吗? ?
它讨论了舍入误差(您所说的“计算噪声”)、 float 表示的 IEEE 754 标准以及计算机上 float 学的实现。
我相信阅读本文可以回答您的问题,或者至少让您更深入地了解 float 学的工作原理。
<小时/>一些有助于您理解的说明 - 太大,无法容纳@Richante 帖子的评论:
首先,realmin
和eps
的区别:
realmin
是最小的标准化 float 。您可以以非规范化形式表示较小的数字。eps
是不同数字之间的最小增量。realmin
=eps(realmin) * 2^52
。
“标准化”和“非标准化” float 在上面链接的论文中进行了解释。
其次,舍入误差并不能表明您对数字的第 n 位数字的“信任程度”。
举个例子:
>> ((0.1+0.1+0.1)^512)/(0.3^512)
ans =
1.0000
我们将 0.3^512
除以自身,所以答案应该正好是 1,对吗?我们应该能够信任 eps(1)
以内的每一位数字。
这个计算的误差实际上是400 * eps
:
>> ((0.1+0.1+0.1)^512)/(0.3^512) - 1
ans =
9.4591e-014
>> ans / eps(1)
ans =
426
计算误差,即第n位数字不可信的程度远远大于 float eps
答案表示中的舍入误差。请注意,我们在这里只进行了六次浮点运算!您可以轻松地进行数百万次 FLOP 来产生一个结果。
我再说一遍:eps()
不是计算错误的指标。不要尝试显示:“我的结果是 1234.567 +/- eps(1234.567)”。这是毫无意义且具有欺骗性的,因为它意味着您的数字比实际情况更精确。
eps
,您的答案的表示中的舍入误差仅为十亿分之一左右。您真正的敌人是每次执行浮点运算时累积的错误,这就是您需要跟踪的错误,以便对错误进行有意义的估计。
关于Matlab:eps的逆向?正重量的准确性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10137137/