了解IEEE

时间:2018-09-02 23:15:46

标签: floating-point computer-science ieee

  

我无法理解这些指数:

  • 为什么指数0000 0000 = -126而不是-127(即0-127)?
    • 指数1111 1111的确切值是什么?
    • 为什么0 1111 1111 0000 0000 0000 0000 0000 000等于无穷大?
  

我对这一切都是新手,所以请简单地解释一下!谢谢!

2 个答案:

答案 0 :(得分:6)

  

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

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

  • 1.11…111•2 0
  • 1.11…110•2 0
  • 1.11…101•2 0
  • 1.11…100•2 0
  • 1.00…011•2 0
  • 1.00…010•2 0
  • 1.00…001•2 0
  • 1.00…000•2 0

然后,当移至下一个较低的数字时,我们将调整指数,因此下一个较低的数字为:

  • 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

您会看到我们只在1.00…000•2 −126 之后才需要0.11…111•2 −126 。相反,如果它是0.11…111•2 −127 ,则将存在一个间隙,即其大小的一半。

  

1111 1111指数的确切值是什么?

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

  

为什么0 1111 1111 0000 0000 0000 0000 0000 0000等于无穷大?

没有数学原因。无穷大并非来自对有效位数和指数进行的任何数学运算。刚刚决定,指数字段1111 1111将表示无穷大和NaN,并且当有效位数字段全为零时,它将表示无穷大;而当有效位数字段并非全为零时,它将表示NaN。

答案 1 :(得分:4)

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

全零位或全一位(0000 00010000 0000)的指数值不是实际指数,而是触发特殊情况的行为。全零指数意味着尾数中没有隐含的前导;这用于subnormal numbers。然后,使用一个全指数来标记该值是无穷大,负无穷大还是NaN,具体取决于符号位和尾数位。

为了进一步阅读,The Floating Point Guide有一个简单易懂的解释,当然,如果您真的想要精髓,Goldberg's paper就是最好的选择。