1

假设我们必须使用浮点变量作为计数器 - 例如

float i = 1;
float previ = 0;
do 
{
   previ = i;
}
while (i++);

i 的值(i-previ)与 1 相差多少?这种差异仍然是一个整数,还是会变成一个有理的非整数?

4

1 回答 1

9

在最常见的浮点实现 IEEE 754 中,第一个不能用 32 位二进制浮点表示的整数是 2 24 +1 (16,777,217)。此时,可以表示 2 24 (16,777,216) 和 2 24 +2 (16,777,218)。

当您将 1 加到 16,777,216 时,精确的数学结果是 16,777,217。由于这是不可表示的,因此将其四舍五入为可表示的值。最常见的默认舍入模式是四舍五入。但是,16,777,216 和 16,777,218 与 16,777,217 的距离相等。在平局的情况下,选择具有偶数低位(在浮点有效数中)的值。所以返回了 16,777,216。

因此,当一个浮点值重复加一时,从零开始,计数一直持续到达到 16,777,216,然后连续产生 16,777,216。

16,777,217 是第一个不可表示的整数的原因是 IEEE 754 32 位二进制格式使用 24 位作为有效数(小数部分)。(显式存储 23 位。对于正常值,高位隐含为 1。)因此,可以用 24 位表示的所有整数都是可表示的。2 24名义上需要 25 个整数位(从 2 24到 2 0)。但是,仅使用 24 个高位不会引入任何错误(它表示为 1•2 24),因为缺少的低位将为零。相反,无法表示 16,777,217,因为它需要丢失的位为 1。

于 2013-02-26T16:56:57.247 回答