【问题标题】:Machine precision estimations机器精度估计
【发布时间】:2011-12-21 04:08:34
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    “机器精度”实际上有两个定义,乍一看听起来完全一样,但实际上并非如此,因为它们为“机器 epsilon”产生了不同的值:

    1. 机器 epsilon 是最小的浮点数 eps1 使得 1.0 + x > 1.0
    2. 机器 epsilon 是 eps2 = x - 1.0 的差,其中 x 是与 x > 1.0 可表示的最小浮点数。

    严格来说,定义是等价的,即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 -- 即@987654334 @(根据定义 2)。所以,本质上,

    eps2 == (1.0 + eps1) - 1.0
    

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

    eps2 == eps1 * 2 (approximatively)
    

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

    就个人而言,我发现eps2 是更“稳健”的定义,因为它不依赖于实际的舍入行为,只依赖于表示,但我不会说它比另一个更正确。与往常一样,这一切都取决于上下文。在谈论“机器epsilon”时要清楚您使用的定义,以防止混淆和错误。

    【讨论】:

    • 不知道为什么数学家会对“这个”感到畏缩。数学家明白浮点数与实数不同,特别是浮点值的相加不是关联的。
    • 史蒂芬,这并不是 110% 认真的!我非常清楚数学家并不愚蠢。但即使是我自己,作为非数学家,也觉得这些公式很尴尬。我的意思是,1 + x - 1 == x * 2?不...
    • 别担心,我只是向工程研究生(作为数学家)解释浮点数太多次了。
    【解决方案2】:

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

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

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

    所以两者的差是2-52

    【讨论】:

      【解决方案3】:

      这取决于你采用哪种方式。

      1 + 2^-53 正好在11 + 2^-52 之间,它们在双精度浮点中是连续的。因此,如果将其四舍五入,则与 1 不同;如果向下取整,则等于 1。

      【讨论】:

      • 那么是舍入误差导致结果有时显示为 2^-53 有时显示为 2^-52 吗?因为那是真正让我困惑的部分。
      • 在数学上,正如 Kerrek 指出的那样,11 + 2^-52 肯定有连续的双精度表示。四舍五入是我能想到的唯一解释,为什么你的实验会显示其他东西。您是否尝试过添加1 和(例如)1.5 * 2^-53
      猜你喜欢
      • 2011-01-12
      • 1970-01-01
      • 1970-01-01
      • 2022-01-12
      • 1970-01-01
      • 2023-03-21
      • 2015-04-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多