机器精度估算

时间:2011-11-03 13:02:19

标签: floating-point floating-point-precision epsilon

有人说双精度浮点数的机器epsilon是2 ^ -53而其他(更常见的)是2 ^ -52。我已经使用除了1之外的整数以及从上方和下方(在matlab中)进行估算来估计机器精度,并且已经获得两个值作为结果。为什么在实践中可以观察到这两个值?我认为应该总是在2 ^ -52左右产生一个epsilon。

3 个答案:

答案 0 :(得分:7)

术语“机器epsilon”存在固有的模糊性,因此要解决此问题,通常将其定义为1与下一个更大的可表示数字之间的差异。 (这个数字实际上(并非偶然)通过逐字递增二进制表示获得。)

IEEE754 64位浮点数有52个显式尾数位,因此53包括隐式前导1。所以连续两个数字是:

1.0000  .....  0000
1.0000  .....  0001
  \-- 52 digits --/

因此两者之间的差异是2 -52

答案 1 :(得分:2)

这取决于你选择哪种方式。

1 + 2^-53恰好位于11 + 2^-52之间的中间位置,它们在双精度浮点数中是连续的。所以,如果你把它四舍五入,它就不同于1;如果你将它向下舍入,则等于1.

答案 2 :(得分:1)

实际上有两种定义"机器精度"这听起来完全相同,但并非如此,因为它们会为机器epsilon产生不同的值:

  1. 机器epsilon是最小的浮点数eps11.0 + x > 1.0
  2. 机器epsilon是差异eps2 = x - 1.0,其中xx > 1.0的最小可表示浮点数。
  3. 严格来说,这些定义是等价的,即eps1 == eps2,但我们不是在谈论真正的数字,而是关于浮点数。这意味着隐式舍入和取消,这意味着近似地eps2 == 2 * eps2(至少在使用IEEE-754浮点数的最常见架构中)。

    更详细地说,如果我们让某些x0.0转到1.0 + x > 1.0的某个点,则会在x == eps1(根据定义1)达到此点。但是,由于综述,1.0 + eps1的结果 1.0 + eps1,但下一个可表示的浮点值大于大于1.0 - 是,eps2(根据定义2)。所以,实质上,

    eps2 == (1.0 + eps1) - 1.0
    

    (数学家会对此感到畏缩。)并且由于舍入行为,这意味着

    eps2 == eps1 * 2 (approximatively)
    

    这就是为什么"机器epsilon"有两个定义,既合法又正确。

    就个人而言,我发现eps2越多,越强大,越#34;定义,因为它不依赖于实际的舍入行为,只取决于表示,但我不会说它比另一个更正确。一如既往,这一切都取决于背景。只要清楚你在谈论"机器epsilon"时使用的定义。防止混淆和错误。