我无法理解这些指数:
0000 0000
= -126而不是-127(即0-127)?
1111 1111
的确切值是什么?0 1111 1111 0000 0000 0000 0000 0000 000
等于无穷大?我对这一切都是新手,所以请简单地解释一下!谢谢!
答案 0 :(得分:6)
为什么指数
0000 0000
= -126而不是-127(即0-127)?
对于大多数正常指数,当我们到达有效位数范围的底部时,我们将下一个指数。例如,从1(含)到2(不含)的可表示数字按降序排列:
然后,当移至下一个较低的数字时,我们将调整指数,因此下一个较低的数字为:
现在,当我们处于最低法线指数时,该范围内的最低数字为:
为了继续进行下去,我们决定最后一步是将前导位更改为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。然后下一个可表示的数字是:
您会看到我们只在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 0001
或0000 0000
)的指数值不是实际指数,而是触发特殊情况的行为。全零指数意味着尾数中没有隐含的前导;这用于subnormal numbers。然后,使用一个全指数来标记该值是无穷大,负无穷大还是NaN,具体取决于符号位和尾数位。
为了进一步阅读,The Floating Point Guide有一个简单易懂的解释,当然,如果您真的想要精髓,Goldberg's paper就是最好的选择。