【发布时间】:2012-04-29 03:06:01
【问题描述】:
IEEE 浮点数学的一个重要特性是,由于位数有限和 base-2 格式,舍入会导致计算中的“错误”。
例如在 C# 中:
(Math.PI * 1e20 / 1e20) == Math.PI; // false
有没有办法确定这些操作的误差幅度? .NET 公开了Double.Epsilon 字段,该字段给出大于零的最小有效值,但这与比较非零数字无关。
编辑:我不是要一种方法来准确地计算误差,我只是想找到一种方法来估计它的大小。
例如(同样,在 C# 中):
(1e20 + 1e3) == 1e20; // true
(1e20 + 1e4) == 1e20; // false
所以1e20 + X 操作的误差似乎约为 1e3,这是有道理的,因为doubles 具有多达 17 位的十进制精度。
【问题讨论】:
-
我想你应该只根据你的计算来计算误差估计。您可以在这里找到一些有用的信息:stackoverflow.com/questions/3166851/….
-
误差是离散和累积的,每次计算都可能出现也可能不出现。预测或计算每次计算的确切误差将非常耗时(您必须对另一个任意精度进行软件计算才能做到这一点),但可以做到。您也可以使用支持 80 位扩展精度浮点数的 delphi 之类的东西来做到这一点。
-
@Lucas:“根据你的计算计算误差估计”是什么意思?
-
@Henry:我的意思是,当您在算法中进行特定计算时(即当您的值为 x 并且您知道x的误差是0.1,你要计算10 * x,结果的误差是10 * 0.1 = 1 )。现在在您更新的问题中,我看到您只想获得它的近似值,但我想可以考虑尝试计算它。
-
@Lucas:我说的是 IEEE 浮点规范中的舍入误差,而不是实验测量误差。例如。在我的“编辑”部分,所有这些数字都由 IEEE 双精度数精确表示,但计算机进行的加法计算仍然存在错误。
标签: .net floating-point double