现在的位置: 首页 > 综合 > 正文

IEEE 754浮点数表示及浮点数转换全解

2018年05月19日 ⁄ 综合 ⁄ 共 1538字 ⁄ 字号 评论关闭

基本上我们记住几个公式就行了(蓝色字体公式)。

第一:浮点表示形式: 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种情况:

     a. 当e表达为e=1-bias,m本身为归一化(<1)情形时,如:0.101,或0.0101. 那么m=0.M,m有效数字部分M已经归一化,指数不需要调整E=0。如10.1,如果e=1-bias,m=101... .0,不是归一化形式,所以不是这种情形。

     b. 除了特殊数:0,无穷大,NaN,以及第一种情形之外,m本身一定是非归一化形式,所以一定要将m转化n=1.M*2^e这种形式,如:1.01*2^1。对应于m=1.M,只存储归一化有效数字部分M,需要按照e=|E|-bias,调整指数|E|=e+bias(增加偏置)。

     c. 特殊数:+∞: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 (不是一个数)

 

是不是很和谐呢!是不是很简单呢!这就是计算机科学家必须理解的问题。

抱歉!评论已关闭.