是否可以证明 |a-b+b - a| <= ulp(a) 用于所有双精度浮点数?

Is it possible to proof |a-b+b - a| <= ulp(a) for all double floating-point numbers?

所以我想知道,如果|a|>=|b|,不等式|a-b+b-a|<=ulp(a)是否为真,如果为真,我如何证明不等式? (评估顺序是从左到右,即 ((a-b)+b)-a )

我想证明,图中a,b是一条直线的两个端点,那么如果我知道b和a-b的值,我想证明我可以得到a的值 没有大于一个 ULP(a) 错误的错误。所以我可以给出条件 |a|>=|b|或|a|<=|b|,但我无法限制它们的实际值。

一些预赛:

  • 我假设使用 IEEE-754 算法,使用二进制基数和四舍五入到最接近偶数。

  • 我进一步假设所有操作数和运算结果都是有限的(既不是无穷大也不是 NaN)。 (如果可能出现无穷大或 NaN,则该命题为假。如果 ab 的大小略小于最大可表示的有限值,但它们符号相反,则a−b是无穷大,所以a−b+b−a是无穷大,其大小超过了a的ULP。)

  • 斜体表示数学变量,如ab。代码格式表示计算的算术,例如 a+b,而 a+b 是精确的数学结果。

  • 我假设 ab 是可表示的,这意味着我们从 a 等于 ab 等于 b,不以任意实数开头 ab 首先转换为可表示值 ab.

  • 舍入到最接近偶数的最大误差是数学结果的 ½ ULP。这是真的,因为任何结果都取决于一个可表示的值或两个可表示的值之间。如果在两个值之间,则round-to-nearest选择较近的一个,到的距离最多为两者之间距离的一半。

  • 对于“x的ULP”,我会写ULP(x)。如果 x 不是可表示值,则 ULP(x) 是小于 |x[ 的最大可表示值的 ULP =144=]|.

|ab|至多为 2|a|,因为 |b| ≤ |a|。所以a−b中的误差最多为½ ULP(2|a|),也就是1个ULP(a)。因此 a−b = ab+e 对于一些舍入误差 e 与 |e| ≤ ULP(a).

现在考虑添加 a−bb 的数学结果。数学结果为a−b + b = ab+e + b = a+e。所以数学结果在 a 的 1 ULP 以内,包括在内。那它可以四舍五入到什么?

根据 ULP 的定义,下一个比 a 更大的可表示数是 a + ULP(a ).1 下一个较小的可表示数通常是 a − ULP(a), 但如果 a 正好是 a − ½ ULP(a) 2 的幂(因此它是二进制中的最小数字,下一个较低的数字具有较小的指数)。即使在这种情况下,在 a 也有另一个可表示的数字 - ULP(a).

因此数学结果a+e位于闭区间[a−ULP(a), a+ULP(a)], 由两个可表示的数字。令 x 为更接近 a+e 的端点,并假设 a+e 根据四舍五入规则四舍五入到 y。如果y在区间外,则a+e的距离y 大于到 x 的距离,要么是因为 y 超出了 x在同一方向或因为 y 位于另一个方向,因此超出了另一个端点,至少与 a+e 因为 x 是,所以 y 更远。因此,a+e 舍入到端点之一或区间内的其他可表示数字。所以它四舍五入到 a 的一个 ULP 内的某个数字,包括在内。

因此a−b+b距离a.

至多1个ULP(a)

脚注

1 为了四舍五入的目的,如果x是最大的可表示有限值,x + ULP(x) 在舍入决定完成之前被视为可表示的。如果四舍五入导致 x + ULP(x) 被选中,则结果为 ∞。 (对于负值也是对称的。)