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

Floating point 不能用单精度浮点表示的最小整数,floating-point,floating-point-precision,Floating Point,Floating Point Precision,所以我知道不能用单精度浮点表示的最大整数是2^(23+1)+1=16777217 我们怎么知道我们使用了2^(23+1)+1。我知道有一个隐含的1,23是尾数中表示的位数,但为什么会这样呢?我想我明白你的问题了。看看这一点,特别是这些变量的结构/设计是如何完成的 Float通常表示浮点变量。这意味着您有(通常为3个字节)存储您的号码。然后还有一个(一个字节)指数,它表示在这个数字内设置点的位置 现在,您可以轻松计算可以存储在此值中的最大值和最小值 但有一个棘手的部分。由于这不是固定点整数,它的精

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


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

我想我明白你的问题了。看看这一点,特别是这些变量的结构/设计是如何完成的

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

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

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

也许你在问为什么指数中还有另一个+1。这里很好地解释了这一点:
这是因为abcdefg形式的尾数实际上代表1。abcdefg。

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

我们是如何计算出我们使用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和2M-1之间
零不能用这种格式表示,但可以将其表示为次正常值,这样就可以了。所有可以表示的非零整数都以规范化格式表示

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

e=地板(log2(i))+e0

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

如果i<2M+1,则(e− e0)≤ 所以M是一个整数。所以我是有代表性的

如果i=2M+1,则(e− e0)=M+1和M=0。所以我是有代表性的


如果i=2M+1+1,则(e− e0)=M+1和M=½。因此i是不可表示的。

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