IEEE 754浮点数除法或减法自身计算,是否总是产生相同的值?

3

除非 IEEE 754 是 NaN、+/-0.0 或 +/-Infinity,否则将其自身相除是否保证结果恰好为 1.0?

同样地,它自己减去自己是否保证结果总是+/-0.0?

2个回答

3
IEEE 754-2008 4.3章节指出:除非另有说明,每个操作都应当被执行,就好像它首先产生了一个无限精度和无界范围的中间结果,然后根据本条款中的某个属性对该结果进行舍入。当一个中间结果是可表示的时,所有的舍入属性都将其舍入为自身;仅当它不可表示时,才会改变其值。减法和除法的规则在5.4中给出,它们没有针对上述情况做任何特殊说明。
根据3.3规定,在符合标准的任何格式中,零和一是可表示的数字集合。特别地,零可以由具有所有零数字的有效数字表示,而一可以由以1开头并跟着“.000…000”和指数为零的有效数字表示。格式的最小和最大指数被定义为始终包括零(emin为1−emax),因此零在其中(含);除非emax小于1,否则不可表示任何数字,即该格式为空且不是实际格式。
由于舍入不会改变可表示的值,而零和一是可表示的,因此将一个有限非零值除以自身总是得到一,从自身减去一个有限值总是得到零。

1
@user1282931:好问题,这是一个很棒的答案。另请参阅:在线 IEEE-754 浮点计算器:https://www.h-schmidt.net/FloatConverter/ - paulsm4
那么这也适用于非规范化的值吗? - matthias_buehlmann
@user1282931:这些规则适用于所有情况。 - Eric Postpischil

0

如果使用相同的文字值,将其除以自身并减去,是的,IEEE754要求产生最接近和一致的匹配。


如果值不是来自于一个字面量而是来自于之前的计算,那怎么办呢?或者你所说的“相同的字面值”是什么意思? - matthias_buehlmann
2
@user1282931:有些编程语言不能保证,例如 x+y 总是具有相同的值:一个实现可能在一个地方计算所需格式的精度,但在另一个地方计算额外的精度。在这种情况下,(x+y) - (x+y) 可能是非零的。此外,相同数字的不同文字形式可能会转换为不同的浮点值。例如,在 C 中,4000e34e6 不需要具有相同的值。这些是编程语言问题,而不是 IEEE 7754 问题。 - Eric Postpischil
是的,但我的意思是,如果使用相同的变量。float foo = ...; float one = foo/foo 这个表达式保证等于1.0f吗? - matthias_buehlmann
回答你的问题:是的,foo/foo 保证为 "1",原因如 Eric Postpischil 上面所述。但是,(x+y) - (x+y) 不一定总是 "0",对于每个编译器都是如此。请阅读本文的最后一节:“IEEE二进制浮点算术标准754的现状讲义”,作者 W. Kahan 教授:https://people.eecs.berkeley.edu/~wkahan/ieee754status/IEEE754.PDF - FoggyDay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接