浮点减法恒等式
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
.
同样,这些将使用常规 ==
进行比较,但如果您对按位相等感兴趣,则必须注意零的符号!
据我了解,在 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
.
同样,这些将使用常规 ==
进行比较,但如果您对按位相等感兴趣,则必须注意零的符号!