Floating point 浮点减法恒等式

Floating point 浮点减法恒等式,floating-point,language-agnostic,ieee-754,Floating Point,Language Agnostic,Ieee 754,据我所知,在IEEE浮点中,以下标识确实始终适用: x - 0.0 == x 但由于有关符号零的问题,以下数学恒等式可能不一定总是适用: 0.0 - x == -x 这是正确的吗?(+0)− (+0)回报(−0)四舍五入时−∞, 但在所有其他舍入模式下(+0)。因此,将x-0.0替换为x仅当舍入模式为−∞ (“向下”)不包括在内。然而,由于在IEEE-754语义下(-0)和(+0)比较相等,x-0.0==x将在所有舍入模式下保持不变 −(+0)导致(−0),而(+0)− (+0)在所有舍入模

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

x - 0.0 == x
但由于有关符号零的问题,以下数学恒等式可能不一定总是适用:

0.0 - x == -x
这是正确的吗?

(+0)− (+0)回报(−0)四舍五入时−∞, 但在所有其他舍入模式下(+0)。因此,将
x-0.0
替换为
x
仅当舍入模式为−∞ (“向下”)不包括在内。然而,由于在IEEE-754语义下(-0)和(+0)比较相等,
x-0.0==x
将在所有舍入模式下保持不变

−(+0)导致(−0),而(+0)− (+0)在所有舍入模式下返回(+0),而不是在向四舍五入时返回(+0)−∞. 因此,将
0.0-x
替换为
-x
将仅在接近舍入模式时提供按位相同的结果−∞ (“向下”)。但是,由于在IEEE-754语义下(-0)和(+0)比较相等,
0.0-x==-x
将在所有舍入模式下保持不变


就位相等(而非浮点相等比较)而言,还应注意,在IEEE-754(2008)中,求反操作(如绝对值和copysign操作)是根据位字符串操作定义的,因此将修改NAN的“符号位”(见本标准第6.3节)。在实现NaN有效负载传递的平台上,如果
x
是NaN,则从零开始的求反和减法的结果在位级别不同。

+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-754(2008)中,求反操作(与绝对值和copysign操作一样)是根据位字符串操作定义的,因此将修改NAN的“符号位”(见本标准第6.3节)。如果
x
为NaN,则
x-0.0==x
0.0-x==-x
的计算结果均为false。