了解 IEEE 中的指数 00000000 和 11111111

Understanding exponent 00000000 and 11111111 in IEEE

I can't get my head around these exponents:

I'm very new to all this, so please explain in simple lay terms! Thanks!

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

全零位或全一位(0000 00001111 1111)的指数值不是实际指数,而是触发特殊情况行为。全零指数意味着尾数中没有隐含的前导一位;这用于 subnormal numbers. And an all-one exponent is used to mark that the value is either infinity, negative infinity, or NaN,具体取决于符号位和尾数位。

进一步阅读,The Floating Point Guide has a nice explanation in easy terms, and of course if you really want the nitty-gritty, nothing beats Goldberg's paper

Why is exponent 0000 0000 = -126 instead of -127 (i.e. 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,
  • 1.11…110 • 2−1,
  • 1.11…101 • 2−1,
  • 1.11…100 • 2−1,

现在,当我们处于最低正常指数时,此范围内的最低数字是:

  • 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 将不可表示。因此,如果 xy 是这些数字,则由于四舍五入(当四舍五入到最接近的可表示值时),它们的计算差 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,就会有一个间隙——这是它需要的一半大小。

What is the exact value of exponent 1111 1111?

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

Why does 0 1111 1111 0000 0000 0000 0000 0000 000 equal infinity?

这没有数学上的原因。无穷大不会产生于对有效数和指数进行的任何数学运算。刚刚决定指数字段1111 1111代表无穷大和NaN,当尾数字段全为零时,它代表无穷大,当尾数字段不全为零时,它代表NaN。