基本上我们记住几个公式就行了(蓝色字体公式)。
第一:浮点表示形式: N=|s| E | M | 。 单精度:s=1位,E=8位,M=23位。 双精度 s=1位,E=11位,M=52位,其中,E,M都为无符号数
第二:bias=, bias是归一化偏置值,或模,代表指数E所能表达的最大值,k是E的位数。它的作用是将浮点数的值分布向0的方向靠拢,本来2^E是指数函数,函数值在E增大时急剧增大。非常不均匀。2^(E-bias)则使这个值进一步减小,在相同的大E时,函数值不会急剧增大,从而保证了浮点数的分布更均匀一点。实际上整个浮点数的分布都不是均匀的,E越接近于1跳跃越小。E=1和=0时的跳跃是相同的,都是最小精度。从e>M的位数开始,n的值将会以相邻两个浮点数(精度)>1的速度增加。E/e越大的,跳变越大。所以在此时最好不要用浮点数来存储,结果将会很不精确(1的数量级以上近似)。所以e=E-bias的作用就是在E较大时降低浮点数的分布密度。
第三:浮点数由这个公式计算得到(N->n): ,或称浮点表示也可以由此公式反推出来(n->N)。
先看从n->N的过程:
整数和小数部分分别转化为二进制,然后合在一起。整数部分:除2取余法,从下往上数。小数部分:乘2取整法,从上往下数。如2.5=10.1,它并不是规范形式,规范要求m必须为1.M或0.M形式。所以必须先进行规格化。再求M,E。
分成3种情况:
- 将m转化n=1.M*2^e这种形式,又分两种情况,
- 当
时,如:1.01*2^1。对应于m=1.M,只存储归一化有效数字部分M,隐含整数位不存储,需要按照e=E-bias,调整指数E=e+bias(增加偏置)。如
,然后得s=0,m=1.01=1.M, e=1。从而M=01(存储时需补齐后面的0),e=1=E-bias, 所以E=1+bias=128。
- 当e<1-bias时,应用特殊格式m=0.M格式,应按照m的格式重新调整
,且使E=0, M转化为二进制存储,若位数不足,则溢出。如:5.877472e-39=
=
=
,所以m=0.M,M=1, E=0。如果按照m=1.M格式,5.877472e-39=
=
,将导致e=-127<1-bias。
- 当
- 特殊数:+∞:s=0,E=全1,M=全0;
-∞:s=1,E=全1,M=全0;
+0:s=0,E=全0,M=全0;
-0:s=1,E=全0,M=全0;
NaN(不是数):s=1/0,E=全1,M=不全0;
看看从N->n的过程:
先看E,M,分别求的e,m,再运用n=....的公式计算最终值。也分为3种情况:
- E=0, 分两种情况:
- M<>全0,0.M=m格式,e=1-bias。
,这里需要将m转化为10进制,使用我把它称之为加余除二法的方法(从2进制小数末位开始每位作为余数加到除数上(开始除数为0)依次除2所得最终结果,每次除完结束),或加权求和法(每位小数乘2的负幂次,再求和)。还可以将小数转化为整数*2^-o, 再用加余乘2法的方法(从2进制整数最高位开始每位作为余数加到乘数上(开始乘数为0)依次乘2所得最终结果,每次加完计算结束)。也可以用加权求和法。
- M=全0, n=0;根据s,判断+/-0。
- M<>全0,0.M=m格式,e=1-bias。
- E>=1, 1.M=m,e=E-bias。
,仍然需要将m转化为10进制,使用上面a所示方法。
- E=全1,两种情况:
- M=全0,n=∞,根据s,判断+/-∞。
- M=不全0,n=NaN (不是一个数)
是不是很和谐呢!是不是很简单呢!这就是计算机科学家必须理解的问题。