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 位的十进制精度。