浮点减法恒等式

Floating-point subtractive identities

据我了解,在 IEEE 浮点中,以下标识确实始终适用:

x - 0.0 == x

但由于有关符号零的问题,以下数学恒等式可能不一定始终适用:

0.0 - x == -x

这是正确的吗?

(+0) − (+0) returns (−0) 当向 −∞ 舍入时,但在所有其他舍入模式中为 (+0)。因此,将 x - 0.0 替换为 x 将提供按位相同的结果 仅当 排除朝向 −∞ ("down") 的舍入模式时。但是,由于 (-0) 和 (+0) 在 IEEE-754 语义下比较相等,因此 x - 0.0 == x 将适用于所有舍入模式。

−(+0) 导致 (−0),而 (+0) − (+0) returns (+0) 在除朝 −∞ 舍入之外的所有舍入模式中。因此,将 0.0 - x 替换为 -x 将仅在舍入模式朝向 −∞ ("down") 时提供按位相同的结果。但是,由于 (-0) 和 (+0) 在 IEEE-754 语义下比较相等,因此 0.0 -x == -x 将适用于所有舍入模式。

就按位相等(而不是浮点相等比较)而言,还应注意在 IEEE-754 (2008) 中,negate操作是(如 绝对值 copysign 操作)根据位串操作定义的,因此将修改 "sign bit" NaN(参见标准的第 6.3 节)。在实现 NaN 有效负载传递的平台上,如果 x 是 NaN,则从零取反和减去的结果因此在位级别上不同。

njuffa 的回答提供了很好的分析。最重要的是,如果您只是使用不区分 +0-0==,并且如果您忽略 NaN 值,则两个身份都成立。但是您可以通过查看位模式根据舍入模式区分表达式,因为您可以在一种情况下获得 -0 而在另一种情况下获得 0

这是另一个我一直感到惊讶的例子。考虑 fma:

的定义
fma (a, b, c) = a * b + c; but with only one rounding instead of two

如果您在上面的恒等式中输入 c = 0,您可能希望以下内容成立:

fma (a, b, 0) == a * b

唉,如果乘法生成 -0,它会失败,因为 -0 + 0+0。在左侧,您会得到 +0,在右侧,您会得到 -0.

同样,这些将使用常规 == 进行比较,但如果您对按位相等感兴趣,则必须注意零的符号!