在浮点运算中是否成立:如果a,b不是+ inf,-inf或NAN,则a = b <=> a-b = 0

时间:2018-07-09 08:06:24

标签: floating-point

假设a,b是两个不是+ inf,-inf或NAN的64位浮点,我可以声明:

  

a = b当且仅当a-b = 0

如果是,为什么它总是成立?

2 个答案:

答案 0 :(得分:3)

不,通常情况并非如此。

如果浮点运算符完全符合IEEE 754,则为true;如果非IEEE-754运算符使用非正规值或逐渐下溢,则可能为true。

但是,并非总是完整使用IEEE 754。处理器具有以下模式很常见:处理器将其中的次标准结果和/或次标准输入更改为零,并且操作系统(或程序初始化代码)可能默认启用此类模式以提高性能。在这种模式下,减去两个非常小的标准数会产生零,而不是在IEEE 754规则下适当的次标准结果。

关于为什么保存,请考虑浮点数的一般格式。每个浮点系统的详细信息各不相同,但通常浮点数为 s N b e ,其中 s (用于符号)为+1或-1, N (称为有效数字)为非负整数, b 是基数, e 是指数。 b 是固定的,通常 N e 的范围受到限制。我们还将假定浮点算术在可表示时返回精确的数学结果,而在不能表示时,则返回用户在特定方向上选择的最接近的可表示值或较近的值。

通用 N 是固定数量的base- b 数字,例如24位为基数为2的格式,在这种情况下,0≤ N < / em> < b d ,其中 d 是位数。或者,可以将其限制为其他最大值,以使0≤ N < N max 。 (例如,Microsoft使用十进制格式,其中 b 为10,但是 N 是96位数字。)在任何一种情况下,如果这是对< em> N ,则a = b(如果a-b == 0成立)。要看到这一点,请考虑两个正浮点数(其他符号的情况如下) N 0 b e 0 N 1 b e 1 。在不失一般性的前提下,假设 e 0 e 1 。如果它们相等,则数学结果为零,并且由于这是可以表示的,因此计算的浮点结果为零。如果它们不相等,则数学结果为( N 0 - N 1 b < / em> e 1 - e 0 )• b < / em> e 0 。术语( N 0 - N 1 b e 1 e 0 )可以为正或负,可以通过设置符号来处理结果,它可能大于或等于 N max 。无论是哪种情况,计算结果都可以为零吗?否,因为 N 0 - N 1 b e 1 e 0 是一个整数,因此,如果不为0,则为至少1个大小,因此可表示的值之一+1• b e 0 或-1• b e 0 比0更接近于数学结果,因此永远不会选择0将结果四舍五入到最接近的可表示值。

因此,对于允许任何 N 使得0≤ N < N max ,并且使用某种“从最近到最近”的方法,该命题成立。 (如上所述,如果浮点算法使用另一种方法,例如即使存在更接近的可表示值,也将次正规值四舍五入为零,则该命题将不成立。)

在某些浮点系统中会出现问题,因为 N 被进一步约束。一个常见的要求是 N 必须为零或必须进行规范化以使其前导位数不为零,这意味着 N = 0或 b d −1 N < b d 。考虑在这样的系统中减去两个数字,得到结果( N 0 - N 1 b e 1 - e 0 )• b e 0 。术语 N 0 - N 1 b e 1 e 0 可能小于 b < em> d −1 。为了解决这个问题,我们希望通过将项乘以 b ,同时除以 b e < sub> 0 表示为 b 。但是指数是有界的。我们只能将其缩小。如果 e 0 太小,我们可能无法调整 N 项以适合 b < sup> d −1 ≤ N < b d 。在这种情况下,必须将精确的数学结果四舍五入为最接近/可表示的值,这可能会导致产生0。因此,在需要在 N 项中进行归一化的浮点系统中,即使a-b为假,a == b也会产生零。

IEEE-754在可能的情况下要求标准化的有效位数,但允许在指数范围的底部对有效位数进行非标准化。因此,在数学上,它的行为类似于要求0≤ N < b d 的系统,因此它满足命题。

(注意:我已将浮点格式描述为 s N b e 其中 N 是整数,浮点格式也经常以 N 作为基数 b 来描述,其中 d 个数字,其中第一个数字之后或第一个数字之前有一个小数点。在这种情况下, N 不一定是整数,而是< em> b 1− d b - d 。该描述是不相关的,因为数学行为是相同的,除了证明必须谈论 N b 的幂的整数倍,而不是简单的整数,并且指数 e 的边界偏移了1− d d 。)

答案 1 :(得分:1)

是的,这是真的(假设使用IEEE-754浮点数,该浮点数在桌面体系结构中无处不在)。一种更强大,更普遍使用的陈述,即斯特本定理,说如果两个数在彼此的2内,则它们的差就可以精确表示出来。您的陈述就是其中的特例。

一种更简单的查看方法是考虑问题可能出在哪里。如果a != ba - b舍入为零,则ab必须极端靠近。实际上,它们之间的差异必须小于最小的次正规数的一半。但这显然小于相邻次正规数之间的距离!试图找到两个差异不相等的浮点数,其差值四舍五入就如同尝试找到两个不相等的整数,其差值四舍五入。