float a = 0; while (true) { a++; if (a > 16777216) break; // Will never break... a stops at 16777216 }
任何人都可以解释这个给我一个浮点值停止增加在16777216在这段代码?
编辑:
或者更简单:
float a = 16777217; // a becomes 16777216
解决方法
我头顶的IEEE-754浮点数(32位)的短整数:
> 1位符号(0表示正数,1表示负数)
> 8位指数(带-127偏置,这里不重要)
> 23位“尾数”
>除了指数值0和255之外,您可以计算该值为:(sign?-1:1)* 2 ^ exponent *(1.0 mantissa)
>尾数位表示小数分隔符之后的二进制数字,例如。 1001 0000 0000 0000 0000 000 = 2 ^ -1 2 ^ -4 = .5 .0625 = .5625,并且不存储小数分隔符前面的值,而是隐式地假定为1(如果指数为255,则假定为0,这在这里不重要),因此对于30的指数,例如,该尾数示例表示值1.5625
现在到你的例子:
16777216正好是224,将被表示为32位浮点数,如此:
> sign = 0(正数)
> exponent = 24(存储为24 127 = 151 = 10010111)
>尾数= .0
>作为32位浮点表示:0 10010111 00000000000000000000000
>因此:值=(1)* 2 ^ 24 *(1.0.0)= 2 ^ 24 = 16777216
现在让我们看看数字16777217,或正好224 1:
>符号和指数相同>尾数将必须正好是2-24,使得(1)* 2 ^ 24 *(1.0 2 ^ -24)= 2 ^ 24 1 = 16777217>这里的问题。尾数不能具有值2-24,因为它只有23位,因此数字16777217只是不能用32位浮点数的精度表示!