IEEE 754浮点除法或减法本身是不是总是产生相同的值?

Posted

技术标签:

【中文标题】IEEE 754浮点除法或减法本身是不是总是产生相同的值?【英文标题】:Does IEEE 754 float division or subtraction by itself always result in the same value?IEEE 754浮点除法或减法本身是否总是产生相同的值? 【发布时间】:2020-08-16 16:34:32 【问题描述】:

除非 IEEE 754 是 NaN、+-0.0 或 +-Infinity,否则是否保证除以自身会得到正好 1.0?

同样地,是否保证自身相减总是导致 +-0.0?

【问题讨论】:

【参考方案1】:

IEEE 754-2008 4.3 说:

... 除非另有说明,否则每个操作都应像首先产生一个正确到无限精度和无限范围的中间结果一样执行,然后根据本节中的属性之一对该结果进行四舍五入。

当中间结果可表示时,所有舍入属性将其舍入到自身;舍入仅在值不可表示时才更改值。减法和除法的规则在 5.4 中给出,并没有说明上述情况的例外情况。

根据 3.3,0 和 1 是可表示的,它指定了可以以符合标准的任何格式表示的数字集。特别地,零可以用一个所有数字都为零的有效数字表示,一个可以用一个有效数字表示,该有效数字以 1 开头,后跟“.000…000”和零的指数。定义格式的最小和最大指数,以便它们始终包含零(emin 为 1−emax,因此它们之间包含零,除非 emax 小于 1,在这种情况下,没有数字是可表示的,格式为空,不是实际格式)。

由于四舍五入不会改变可表示的值,并且 0 和 1 是可表示的,因此将有限的非零值除以自身总是产生 1,而从自身中减去有限的值总是产生零。

【讨论】:

@user1282931:好问题,这是一个很好的答案。还请参见:在线 IEEE-754 浮点计算器:h-schmidt.net/FloatConverter 所以这也适用于非规范化值? @user1282931:规则适用于所有情况。【参考方案2】:

如果使用相同的文字值,则对其自身进行除法和减法 - 是的,IEEE754 要求产生最接近且一致的匹配。

【讨论】:

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

以上是关于IEEE 754浮点除法或减法本身是不是总是产生相同的值?的主要内容,如果未能解决你的问题,请参考以下文章

无法分离 ieee 754 浮点的不同部分

从 IEEE 754-2008 十进制浮点数据转换为二进制浮点格式

IEEE 754的简介

转换为 IEEE 754 单精度浮点格式帮助

将十进制数表示成ieee754标准的32浮点规格化数 27/64

跨编译器的 IEEE-754 二进制模式一致性浮点文字