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