不能用单精度浮点表示的最小整数
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 不可表示。
【讨论】:
以上是关于不能用单精度浮点表示的最小整数的主要内容,如果未能解决你的问题,请参考以下文章