C 用作整数的浮点的行为

C 用作整数的浮点的行为,c,floating-point,C,Floating Point,假设我们必须使用一个浮点变量作为计数器,例如 float i = 1; float previ = 0; do { previ = i; } while (i++); i(i-previ)与1的差值是多少?这个差还是一个整数,还是一个有理非整数?在最常见的浮点实现IEEE 754中,第一个不能用32位二进制浮点表示的整数是224+1(16777217)。此时,224(16777216)和224+2(16777218)是可表示的 将1与16777216相加时,精确的数学结果为167772

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

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

i(i-previ)与1的差值是多少?这个差还是一个整数,还是一个有理非整数?

在最常见的浮点实现IEEE 754中,第一个不能用32位二进制浮点表示的整数是224+1(16777217)。此时,224(16777216)和224+2(16777218)是可表示的

将1与16777216相加时,精确的数学结果为16777217。由于这是不可表示的,因此将其四舍五入为可表示的值。最常见的默认舍入模式是舍入到最近。然而,16777216和16777218与16777217的距离相等。如果是ties,则选择偶数低位的值(在浮点有效位中)。因此,返回16777216

因此,当一被反复添加到浮点值时,从零开始,计数继续,直到达到16777216,然后连续产生16777216


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

在最常见的浮点实现IEEE 754中,不能用32位二进制浮点表示的第一个整数是224+1(16777217)。此时,224(16777216)和224+2(16777218)是可表示的

将1与16777216相加时,精确的数学结果为16777217。由于这是不可表示的,因此将其四舍五入为可表示的值。最常见的默认舍入模式是舍入到最近。然而,16777216和16777218与16777217的距离相等。如果是ties,则选择偶数低位的值(在浮点有效位中)。因此,返回16777216

因此,当一被反复添加到浮点值时,从零开始,计数继续,直到达到16777216,然后连续产生16777216


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

为什么不将其放入循环中,看看得到什么?@perfanoff在您的示例中,差不总是零吗?自从你将i赋值给previ?对不起,我已经修复了代码。我在问,在哪一点上,使用浮点和int作为计数器停止产生相等的结果。为什么不把它放在一个循环中,看看你得到了什么?@perfanoff在你的示例中,差不总是零吗?自从您将i分配给previ?抱歉,我已经修复了代码。我在问在哪一点上使用浮点和int作为计数器停止产生等效结果。刚刚测试了添加浮点++,想知道为什么它在16777216处停止。刚刚测试了添加浮点++,想知道为什么它在16777216处停止。