.net 浮点计算中的估计误差

.net 浮点计算中的估计误差,.net,floating-point,double,.net,Floating Point,Double,IEEE浮点数学的一个重要特性是,由于位数和基2格式的限制,舍入会导致计算中的“错误” 例如,在C#中: 有没有办法确定这些操作的误差大小。NET公开了提供大于零的最小有效值的字段,但这与比较非零数无关 编辑:我不是在寻求一种精确计算误差的方法,我只是想找到一种估算误差大小的方法 例如(同样,在C#)中): 因此,运算的误差1e20+X似乎约为1e3,这是有意义的,因为双精度最多有17位十进制精度。您需要的是机器ε(您可以计算),而不是最小的(denorm)正数:有关奇怪的命名约定,请参阅 一旦

IEEE浮点数学的一个重要特性是,由于位数和基2格式的限制,舍入会导致计算中的“错误”

例如,在C#中:

有没有办法确定这些操作的误差大小。NET公开了提供大于零的最小有效值的字段,但这与比较非零数无关

编辑:我不是在寻求一种精确计算误差的方法,我只是想找到一种估算误差大小的方法

例如(同样,在C#)中):


因此,运算的误差
1e20+X
似乎约为1e3,这是有意义的,因为
双精度
最多有17位十进制精度。

您需要的是机器ε(您可以计算),而不是最小的(denorm)正数:有关奇怪的命名约定,请参阅

一旦有了机器epsilon,您就知道(根据IEEE标准),任何基本代数运算*,+,/,-的相对误差最多为epsilon,即x flop y=(x op y)(1+delta),其中:

  • flop是浮点操作,例如浮点加法
  • op是实数算术中的对应运算

  • delta是相对舍入误差,以| delta |为界,我想你应该根据你的计算来计算误差估计。您可以在此处找到一些有用的信息:。错误是离散的和累积的,每次计算都可能发生,也可能不会发生。预测或计算每次计算的准确误差将非常耗时(您必须进行软件计算,以达到另一个任意精度),但这是可以做到的。你也可以用delphi这样的软件来计算,它支持80位扩展精度浮点。@Lucas:你说的“根据你的计算来计算误差估计”是什么意思?@Henry:我的意思是,你可以使用有关在算法中进行特定计算时误差如何变化的信息来计算误差(即,当你有一个x值,并且你知道x的误差为0.1,并且你想要计算10*x时,结果的误差为10*0.1=1).现在在你更新的问题中,我看到你只是想得到它的近似值,但我想可以考虑只计算它。@Lucas:我说的是IEEE浮点规范中的舍入误差,而不是实验测量误差。例如,在我的“编辑”中所有这些数字都精确地用IEEE双精度表示,但计算机进行的加法计算仍然存在错误。
    (Math.PI * 1e20 / 1e20) == Math.PI; // false
    
    (1e20 + 1e3) == 1e20; // true
    (1e20 + 1e4) == 1e20; // false