为什么float变量在C#中的16777216停止递增?

前端之家收集整理的这篇文章主要介绍了为什么float变量在C#中的16777216停止递增?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
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位浮点数的精度表示!

猜你在找的CSS相关文章