不能用单精度浮点表示的最小整数

Posted

技术标签:

【中文标题】不能用单精度浮点表示的最小整数【英文标题】:Smallest integer not representable in single precision floating point 【发布时间】:2014-11-29 21:10:01 【问题描述】:

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

我们是如何计算出我们使用 2^(23+1) + 1 的。我知道有一个隐含的 1,而 23 是尾数中表示的位数,但为什么会这样?

【问题讨论】:

任何整数的二次幂(最多 2^127)都可以用浮点数精确表示。您必须使定义更加精确。 我想找到不能用单浮点精度表示的最小整数(不一定是二的幂)。根据我的发现,它是 16,777,217,但我不完全理解我们是如何找到这个数字的。 @Wilson:您在第二段中回答了您的问题。对于你的解释,我没有什么要补充的。特别是,当您问“为什么这样有效?”时,我不知道您在寻找什么。 @nneonneo 由于设置 32 位(浮点数)只有 2^32 种不同的方法,因此您最多可以精确表示 2^32 个不同的值。 float 类型表现为十进制数,您只能使用 1-9 中的 7 个数字,但如果需要,您可以在前后填充 120+ 个零。 @DanielB。如果您仔细阅读我的评论,您会注意到我专门指的是两个整数的幂 - 2^0、2^1、2^2、2^3、...、2^127。所有这些都可以用单精度浮点数精确表示,尽管它们的相邻整数可能无法精确表示。 【参考方案1】:

我认为这里的技巧是理解浮点表示的基础:每个数字表示为 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 位产生。

【讨论】:

【参考方案2】:

我想我明白了你的问题。看看这个,特别是这些变量的结构/设计是如何完成的。 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。

【讨论】:

【参考方案3】:

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

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

(-1)s2(e – e0)(1+(m/2M))

地点:

s为符号位,取值为0或1。 e 是指数字段,其值介于 1 和 2E-2 之间,其中 E 是指数位数(值为 0 和 2E-1用于次正规和无限/NaN)。 e0 是指数偏差。它实质上设置了浮点数的整体范围。 M 是尾数位数。 m是尾数,取值在0到2之间M-1

这种格式不能表示零,但是可以将它表示为次正规,所以没关系。所有可以表示的非零整数都以标准化格式表示。

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

e = floor(log2(i)) + e0

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

如果 i M+1 那么 (e − e0) ≤ M 所以 m 是一个整数。因此 i 是可表示的。

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

如果 i = 2M+1 + 1 则 (e − e0) = M+1 且 m = ½。因此 i 不可表示。

【讨论】:

以上是关于不能用单精度浮点表示的最小整数的主要内容,如果未能解决你的问题,请参考以下文章

高精度小数

浮点中整数的精确表示

浮点数的十六进制表示

浮点型数据的精度是啥意思

浮点型是啥意思

代码的表示