IEEE制定的浮点数表示规则


本文摘自:http://blog.csdn.net/chen_lady/article/details/51105443

IEEE制定的浮点数表示规则;

了解:

  目前C/C++编译器标准都遵照IEEE制定的浮点数表示法来进行float,double运算。这种结构是一种科学计数法,用符号、指数和尾数来表示,底数定为2——即把一个浮点数表示为尾数乘以2的指数次方再添上符号。下面是具体的规格:
                    符号位     阶码      尾数     长度
     float           1          8           23      32
     double        1         11          52      64

 

以下通过几个例子讲解浮点数如何转换为二进制数

例一:

已知:double类型38414.4。

求:其对应的二进制表示。

  分析:

       double类型共计64位
           最高位(第63位)是符号位,1表示该数为负,0表示该数为正;
           62-52位,一共11位是指数位;
           51-0位,一共52位是尾数位。

  步骤:

    按照IEEE浮点数表示法,下面先把38414.4转换为十六进制数。把整数部和小数部分开处理:

    整数部直接化十六进制960E 即: 1001011000001110

      小数的处理:
       0.4=0.5*0+0.25*1+0.125*1+0.0625*0+……
         实际上这永远算不完!这就是著名的浮点数精度问题。
        

           手工算到53位那么是:38414.4(10) = 1001011000001110.0110011001100110011001100110011001100(2)

    科学记数法为:1.001011000001110 0110011001100110011001100110011001100,左移了15位,指数为15。

           阶码:

      按IEEE标准一共11位,可以表示范围是-1024 ~ 1023。为了便于计算,iEEE规定都先加上1023(2^10-1),

                 阶码:15+1023=1038。二进制表示为:100 00001110
           
符号位:

      因为38414.4为正,对应0;

           结果:(尾数二进制最高位的1不要)

                                         |--                                     尾数                                                         --|             

         符号位       阶码           |--尾数中的整数部分 -|  |--                      尾数中的小数部分                        --|                     
    0    1000000 1110   0010 11000001 110   01100  11001100  11001100  11001100  11001100

 

例二:

已知:整数3490593(16进制表示为0x354321)。

求:其对应的浮点数3490593.0的二进制表示。 

解法如下:

  先求出整数3490593的二进制表示:

       1.1010101000011001000012×221

 

     阶码:

     同上例,阶码值 = 实际指数值 +  127  ,那么本例子的阶码值为: 148 = 127 + 21 ;

        将148转为二进制表示为10010100

 

     结果:(尾数二进制最高位的1不要)

                                    

     符号位       阶码                        尾数                                        
    0     10010100   101010100001100100001