gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 03:51:10 25 4
gpt4 key购买 nike

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 float (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 位 float :

  • sign = 0(正数)
  • 指数 = 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 位 float !

关于c# - 为什么 float 变量在 C# 中停止递增到 16777216?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12596695/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com