Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

Gray-Ice

个人博客兼个人网站

本篇博文的内容参考自CSAPP第三版。

IEEE浮点数

大致概念

IEEE浮点标准用V = (-1)s * M * 2E 的形式来表示一个数。
符号s决定这数是负数(s=1)还是正数(s=0),而对于数值0的符号位解释作为特殊情况处理。
尾数M是一个二进制小数。
阶码E的作用是对浮点数加权,这个权重是2的E次幂(可能是负数)。
浮点数的位表示划分为3个字段,分别对这些值进行编码:
一个单独的符号位s直接编码符号s。
k位的阶码字段编码E。
n位的小数字段编码M。
这些内容建议直接看CSAPP第三版78页,我写这篇博客的目的其实是为了记录下来如何表示E和M。

表示方法

将一个位序列划分成三个部分,从高位到低位,第一部分表示s,共有1位;第二部分表示E,共有k位;第三部分表示M,共有n位。


这里我们假设有一个8位的位序列,第一部分用来表示符号s,所以占据一位;第二部分用来表示E,它占3位,因为我们用k表示第二部分的位数,所以k=3;第三部分用来表示M,它占4位,因为我们用n表示第三部分的位数,所以n=4。这样一个8位的位序列就已经分配完了,接下来我们来看看它是如何表示浮点数的。
s的值如果为1,那么该浮点数为负数;如果s的值为零,那么该浮点数为正数。
第二部分的位字段如果全部为1或者全部为0,属于特殊情况。我们先讲正常情况的。

规格化的值

这里我们讲的是正常情况:第二部分的位字段不全部为1或者0。因为第二部分共3位,而且其位字段不全部为1或者为0,所以其最大值为0b110,即十进制的6。在这时,阶码字段E为:E = e - bias。e为第二部分所表示的无符号值,这里我们假设第二部分表示的为其最大值,即0b110,十进制的6。bias为2k-1-1,所以E = 6 - (23 - 1 - 1) = 3。M = 1+f。f为第三部分表示的小数值,即(1或0) * 2-1 + (1或0) * 2-2 +…(1或0) * 2-4。设第三部分的位表示为:0b1000,则M = 1 + f = 1 + 1/2 = 3/2。此时我们将第一部分的值设为1,那么V = -1 * 23 * 3/2 = -12。

非规格化的值

当第二部分全部为0时,E = 1 - bias,M = f。所以当第二部分和第三部分都为0时,值为(+或-)0。

特殊值

当第二部分全部为1,当第三部分全部为0,得到的值表示无穷。s = 0则为正无穷,s = -1则为负无穷。
当第二部分全部为1但是第三部分不全部为0,结果值被称为NaN,即”Not a Number”。

如果发现讲的哪里有问题欢迎提出或补充。
本篇完。

评论



愿火焰指引你