机器 epsilon 与浮点舍入误差有何关系?

How is machine epsilon related to floating point rounding error?

我了解到,由于尾数中的位数有限,浮点数可能会遇到舍入。 另外,我读到机器 epsilon 表示一个浮点数,使得 1 + epsilon 等于下一个最小可表示数。

a) 但是我无法将 epsilon 和舍入误差之间的关系联系起来。谁能通俗地解释一下它们之间的关系?

b) epsilon 是否仅取决于用于尾数的位,或者甚至用于指数的位在确定 epsilon 时也起作用?

c) 1/3 是如何用浮点数表示的?我知道它是 0.3(重复),但接下来是什么?从这里如何以二进制形式表示?

I have read that floating points may encounter rounding due to finite number of bits in mantissa.

Every定长数值格式由于位数有限可能会出现错误,包括整数格式、浮点格式、定点格式和有理数格式。实数运算有无限多的结果可以通过算术运算得到,所以任何有限位数的格式都不能表示所有可能的结果。

浮点数的小数部分的首选术语是“有效数”。 “尾数”是对数的小数部分的旧术语。尾数是对数的(向尾数添加一些东西会乘以表示的数字)。有效数是对数的(向有效数添加一些东西会增加表示的数字——尽管按指数缩放,但不受原始有效数的影响)。

Also, I have read that machine epsilon represents a floating point such that 1 + epsilon is equal to next minimum representable number.

这是机器 epsilon 的常见但不正确的定义,或者至少表述不当。更多内容见下文。

浮点表示的一种形式是Mbe,其中:

  • M,有效数,是一个限制在一定范围内的整数。对于 IEEE-754“单一”格式,也称为 binary32,−16,777,216 < M < +16,777,216。 (16,777,216 是 224M 可以是数量级最大为 16,777,215 的任何整数,因为 16,777,215 是 24 位二进制数可以表示的最大整数表示,还有一个符号位表示M是正数还是负数。)
  • b 是格式固定的基数。对于“二进制”格式,b 是 2.
  • e,指数,是一个限制在一定范围内的整数。对于 binary32,−149 ≤ e ≤ 104.

浮点数表示的另一种形式±Mbe,其中:

  • M是一个二进制数,小数点前一位(小数点的一般等价物),小数点后有固定位数。对于 binary32,即点后 23 位,因此总共 24。
  • b如上是基数
  • e如上是整数。对于 binary32,−126 ≤ e ≤ 127.

这两种形式是等价的:每个可以用任一格式表示的数字都可以用另一种格式表示。要在 binary32 格式的形式之间切换,请将第一种格式的 M 除以 223(从而生成一个二进制数字,其前面有一个数字point and 23 after) 并将 23 添加到 e (从而补偿除法并在所需的间隔内生成新的 e),或者执行反向操作为反向。

我们可以自由选择使用哪种形式,两种形式的用途不同。后者在规范中最常见,但前者对一些数值分析很有用,这就是我介绍它的原因。另外,有时符号写成 −1 的幂:(−1)s•M•be,其中符号位 s 为 0 或 1。

现在我们可以考虑算术中出现的舍入误差。

假设我们做一些运算,无论是加减乘除还是其他运算,它有一个实数运算结果x,我们想要适合它的浮点格式。让我们写 x = Mbe,其中 M = xe = 0。然后我们可以通过 M 乘以或除以 b 来调整它,直到它尽可能大而不超过 M[ 的界限=201=]。我们还调整 e 以补偿我们乘以或除以 b 的次数。然后我们有一个新的 M 和一个新的 e,还有 x = Mbe.

如果这个新的 M 是一个整数并且 e 在范围内,我们就完成了,我们有 x 要求的形式。 x 可以用浮点数格式表示,运算可以产生没有舍入误差的结果。

由于问题是关于舍入误差的,我假设 e 在范围内并且保持不变。如果它越界,就会导致上溢或下溢,但我不会讨论那些异常结果。

如果M不是整数,则x不能用浮点数格式表示。由于 M 和我们可以通过调整 e 一样大而不超出尾数的界限,所以没有办法消除M 的小数部分,并使 M 成为整数,如表格所要求的那样。我们可以产生的最佳结果是将 M 四舍五入到最接近的整数。

舍入有多种规则,包括:

  • M四舍五入到任一方向上最接近的整数。如果有平局(分数恰好是 ½),四舍五入使 M 相等。这通常是默认规则。
  • 向上舍入,朝向+∞。 (这使得正 M 变大,负 M 变小。)
  • 向下舍入,朝向-∞。 (这与上面的相反。)
  • 向零舍入。 (这使得所有非整数 M 的量级都变小了。)
  • 四舍五入使 M 为奇数,即使最近的偶数比最近的奇数更接近。 (这是一种对中间操作有用的特殊舍入模式,因为它保留了存在非零小数部分的信息。)

现在我们可以回答这个问题了:

a) However I am not able to connect the relationship between epsilon and rounding error. Can anyone explain in layman terms that how these are related?

舍入误差可以有多大?使用第一个舍入规则,到最近,我们将移动 M 使其成为整数的最远距离是 ½。这是因为,对于两个连续整数 nn+1 之间的每个数字,从数字到 n 的距离 是 ½ 或更小,或者从数字到 n+1 的距离是 ½ 或更小(或两者)。 (你只能进入森林的一半,因为,在那之后,你就要出去了。)

因此,使用最近舍入法,最大舍入误差为M单位的½。回想一下 Mbe 缩放,所以绝对误差最多为½•bebe 称为最小精度单位 (ULP),因此最大绝对误差为 ½超低功耗。请注意,ULP 根据表示的数字而变化——它按 be 缩放,因此1的ULP不同于128的ULP或1/256的ULP。

使用其他舍入规则,我们可能会将 M 调整最多 1。例如,如果真实结果的小数部分为 .99,我们是向零舍入,我们将 M 调整 0.99 以获得零方向的下一个整数。

机器 epsilon 是 1 的 ULP。

在binary32的第一种浮点形式中,1表示为8,388,608•2−23。所以这个的ULP是1•2−23。在第二种形式中,1 表示为 1.000000000000000000000002•20。向上调整 1 ULP 会产生 1.000000000000000000000012•20,这是 0.0000000000000000000000012 的差异•20,等于2−23.

现在我们可以明白为什么问题中的定义是错误的或表述不当了。它通常表示为 epsilon 是最小的 e 使得 1+e != 1,这意味着它是第一个数字,因此将它添加到 1 会产生 1 之后的下一个数字。在该演示文稿中,它是错误的。要了解原因,请考虑添加 1 (8,388,608•2−23) 和 3•2−25。实数结果为8,388,608.75•2−23。为了获得可表示的结果,我们必须将其四舍五入为 8,388,609−23,从而得到下一个大于 1 的可表示值。但是 1 的 ULP 应该是 2− 23,即4•2−25,大于3•2−25。因此,根据该定义,ULP 不会是最小的数字,因此将它与 1 相加会产生下一个可表示的数字。这不是我们想要的定义。

机器 epsilon 确实是最小的数 e 使得 1+e 的实数算术结果是下一个可表示的数字。但是,如果我们这样表述定义,我们必须清楚我们想要的是 1+e 的实数结果,而不是计算的浮点数结果,由于上面的四舍五入。我们可以说机器 epsilon 是 1 和下一个大于 1 的可表示值之间的差值。

b) Is epsilon only dependent on bits used for mantissa or even the bits used for exponent play an part in determining the epsilon?

如上所示,当我们使用第一种形式时,其中M是一个整数,ULP只是缩放部分,be。但是要知道指数是多少,我们必须根据可用边界计算M。正如你在上面看到的那样,为了以这种形式表示 1,我们必须对其进行缩放,得到 8,388,608•2−23,从中我们看到 ULP 是 2− 23。在第二种形式中,我们可以直接使用1作为尾数,不做任何调整,将1表示为1.000000000000000000000002•20。但是,要计算ULP,我们必须计算出M的低位的位置值。因此,无论哪种方式,尾数的宽度和指数的值都会在确定 ULP 时发挥作用。

c) How is 1/3 represented in floating point representation? I understand that it's 0.3(recurring) but then what's next? How will it be represented in binary form from here?

⅓ 不能用二进制浮点数格式表示。如果我们将其缩放为 224 以下的最大幂,我们将得到 ⅓ = 11,184,810⅔•2−25。我们在 binary32 格式中最接近的是将其四舍五入为 11,184,811•2−25,即 0.3333333432674407958984375.