Floating point 理解IEEE中的指数00000000和11111111

Floating point 理解IEEE中的指数00000000和11111111,floating-point,computer-science,ieee,Floating Point,Computer Science,Ieee,我无法理解这些指数: 为什么指数0000 0000=-126而不是-127(即0-127)? 指数的准确值是多少 为什么011111100000000等于无穷大 我对这一切都很陌生,所以请用简单的俗语解释一下!谢谢 单精度浮点的指数偏差为127。这意味着指数值127(1000 0000)被评估为实际指数零,指数值1(0000 0001)被评估为实际指数-126 所有零位或所有一位的指数值(0000 0000或1111111)不是实际指数,而是触发特殊情况行为。全零指数意味着尾数中没有隐含

我无法理解这些指数:

  • 为什么指数
    0000 0000
    =-126而不是-127(即0-127)?
    • 指数的准确值是多少
    • 为什么
      011111100000000
      等于无穷大
我对这一切都很陌生,所以请用简单的俗语解释一下!谢谢


单精度浮点的指数偏差为127。这意味着指数值127(
1000 0000
)被评估为实际指数零,指数值1(
0000 0001
)被评估为实际指数-126

所有零位或所有一位的指数值(
0000 0000
1111111
)不是实际指数,而是触发特殊情况行为。全零指数意味着尾数中没有隐含的前导一位;这是用来做运动的。一个全一指数用来标记值是无穷大,负无穷大,或者,取决于符号位和尾数位

对于进一步阅读,有一个很好的解释,用简单的术语,当然,如果你真的想了解细节,没有什么比这更好的了

为什么指数
0000 0000
=-126而不是-127(即0-127)

对于大多数正态指数,当我们到达有效位范围的底部时,我们会下降到下一个指数。例如,从1(包括)到2(排除)的可表示数字按降序排列:

  • 1.11…111•20
  • 1.11…110•20
  • 1.11…101•20
  • 1.11…100•20
  • 1.00…011•20
  • 1.00…010•20
  • 1.00…001•20
  • 1.00…000•20
然后,当转到下一个较低的数字时,我们调整指数,因此下一个较低的数字是:

  • 1.11…111•2−一,
  • 1.11…110•2−一,
  • 1.11…101•2−一,
  • 1.11…100•2−一,
现在,当我们处于最低正态指数时,该范围内的最低数值为:

  • 1.00…011•2−126,
  • 1.00…010•2−126,
  • 1.00…001•2−126,
  • 1.00…000•2−126
为了在这一点上继续,决定最后一步是将前导位改为0,而不是1。这里有一个选择:指数字段中带零的数字可以继续这个模式,继续到指数−127,那么下一个可表示的数字是1.11…111•2−127,或者他们可以坚持下去−126但将前导位改为0而不是1

如果模式继续,那么,例如,1.11…111•2−127和1.11…110•2−127都是可表示的数字,但它们的差值为0.00…001•2−127 = 1 • 2−150,将不具有代表性。因此,如果
x
y
是这些数字,由于四舍五入(当四舍五入到最接近的可表示值时),它们的计算差值
x-y
必须为0。然而,有时人们编写的代码是这样的:

if (x == y)
    Handle special case.
else
    Handle normal case with some calculation involving division by x-y.
所以继续指数模式−127会破坏一些代码,导致浮点运算以不希望的方式运行。因此,我们选择打破这种模式,将指数保持在−126,并使前导位为0而不是1。下一个可表示的数字是:

  • 0.11…111•2−126,
  • 0.11…110•2−126,
  • 0.11…101•2−126,
  • 0.11…100•2−126,
  • 0.00…011•2−126,
  • 0.00…010•2−126,
  • 0.00…001•2−126,
  • 0.00…000•2−126
你可以看到我们想要0.11…111•2−126刚过1.00…000•2−126如果它是0.11…111•2−127相反,会有一个一半大小的差距

指数1111111的准确值是多少

当指数字段为1111111时,它不表示正常浮点格式的任何数字指数。指数字段中的值是特殊值(无穷大和NaN)的代码

为什么0 1111111 0000 000等于无穷大


这没有数学上的原因。对有效位和指数执行的任何数学运算都不会产生无穷大。刚刚决定,指数字段1111111将表示无穷大和NaN,当有效位字段全为零时,它表示无穷大,当有效位字段不全为零时,它表示NaN。

我理解了你写的大部分内容,但有一个问题:在1.00…000•2^-126之后,为什么不能用1.11…111•2^-127而不是0.11…111•2^-126?因为+/-
1.0*2^-127
之间还有很大的差距。通过将其指数保持在
2^-126
,非规范数正好填补了+/-
1.0*2^-126
之间的空白,包括
0
@doctopus:1.11…111•2^-127的实际相当重要的表示形式比0.11…111•2^-126更接近之前的数字(更大),但请注意,前面已经说过,我们决定将前导位改为0,而不是降低指数。做出这一决定的原因并不是要在那一点上减小间隙大小,而是因为它会产生算术特性。如果我们把指数降到−127,之后的下一步必须是归零,因为我们没有指数了。然后会存在不同的数字,它们的减法产生零……这可能会破坏人们编写的一些代码,例如
如果(x!=y){做一些计算,包括除以x-y}
。例如,减去1.11…111•2^-127和1.11…110•2^-127在数学上是1•2^−150,但这无法表示,因此必须四舍五入为零。B