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

5 floating-point precision

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

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

use*_*542 1

我想我明白了你的问题。看看这个,特别是这些变量的结构/设计是如何完成的。http://en.m.wikipedia.org/wiki/Single_ precision

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

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

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

也许你想问为什么指数中还有一个+1。这里很好地解释了这一点:Which is the first integer that an IEEE 754 float is incapable to indicates certain? 这是因为 abcdefg 形式的尾数实际上代表 1.abcdefg。