最小整数在单精度浮点中无法表示

时间:2014-11-29 21:10:02

标签: floating-point floating-point-precision

所以我知道单个精度浮点无法表示的最大整数是2 ^(23 + 1)+ 1 = 16,777,217。

我们怎么知道我们使用2 ^(23 + 1)+ 1.我知道有一个隐含的1,同时23是尾数中表示的位数,但为什么这有效?

3 个答案:

答案 0 :(得分:2)

我认为这里的技巧是理解浮点表示的基础:每个数字表示为1.fraction * 2 ^ exponent。这里的关键是知道指数(8位)和分数(23位)都有限制,但这些限制不一定匹配。例如,我们可以使用8位指数创建2 ^ 24,而我们不能使用分数2 ^ -24(因为它只有23位)。因此,如果你想使数字16777216 = 2 ^ 24,你只需将分数设置为0并将指数设置为24。但是,如果你想表示16777217 = 2 ^ 24 + 1,你唯一能做的就是是添加一小部分,所以当它乘以2 ^ 24时它产生1,而那个小部分应该是2 ^ -24,遗憾的是只有23位数不能产生。

答案 1 :(得分:1)

我想我得到了你的问题。看看这个,特别是关于如何完成这些变量的结构/设计。 http://en.m.wikipedia.org/wiki/Single_precision

Float通常代表浮点变量。这意味着您(通常是3个字节)存储您的号码。然后你还有一个(一个字节)的指数,它表示在这个数字内设置点的位置。

现在,您可以轻松计算出可以存储在此值中的最大和最小数字。

但是有一个棘手的部分。由于这不是固定点整数,因此它可能具有有限的精度,可能导致奇怪的问题。随着数字越来越大,数字之间的绝对距离越来越大。 在某些时候,您将到达一个数字,您可以在其中添加1,并且它将保持相同的数字,因为一个数字超出了您可用的精度范围。 正如您将在上面的wiki页面上看到的: 1位用于标记负数,23位用于精度,8位用作指数。现在想象一下,作为一个例子,指数将是40,现在你将有一个23位数字,其中点位于位置40.所有其余部分用0填充。添加1不会改变数字,因为它在外面重要的范围,不会被存储。

也许你在问为什么指数中还有另外一个+1。这里很好地解释了这一点:Which is the first integer that an IEEE 754 float is incapable of representing exactly? 这导致abcdefg形式的尾数实际上代表1.abcdefg。

答案 2 :(得分:0)

  

我们怎么知道我们使用2 ^(23 + 1)+1

IEEE浮点表示以下形式的归一化数字。

(-1) s 2 (e – e 0 (1+(m / 2 M ))

位置:

  • s是符号位,值为0或1。
  • e是指数字段,其值介于1和2 E -2之间,其中E是指数位数(值0和2 E -1用于次法线和无穷/ NaNs。
  • e 0 是指数偏差。它实际上是设置浮点数的整体范围。
  • M是尾数位数。
  • m是0到2 M -1
  • 之间的尾数

零不能用这种格式表示,但是可以将其指定为次标准态,所以可以。所有可以表示的非零整数都以规范化格式表示。

我们将正整数i转换为浮点数。

e = floor(log 2 (i))+ e 0

m =((i / 2 (e – e 0 )-1)2 M

如果i <2 M + 1 ,则(e − e 0 )≤M,因此m是整数。因此,我可以代表。

如果i = 2 M + 1 ,则(e − e 0 )= M + 1且m =0。因此,i是可表示的。

如果i = 2 M + 1 +1,则(e − e 0 )= M + 1且m =½。因此我无法代表。