IEEE浮点数学的一个重要特性是,由于位数和base-2格式的限制,舍入会导致计算中出现“错误”。
E.g。在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位数。
答案 0 :(得分:0)
你需要的是机器epsilon(你可以计算)而不是最小(denorm)正数:有关奇怪的命名约定,请参阅http://www.johndcook.com/blog/2010/06/08/c-math-gotchas/。
一旦你拥有了机器epsilon,你知道(根据IEEE标准)任何基本代数运算*,+,/, - 的相对误差至多为epsilon,即x flop y =(x op y) (1 + delta)其中: