zoukankan      html  css  js  c++  java
  • 浮点数的二进制表示

    基础知识:

    十进制转十六进制;

    十六进制转二进制;

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

    了解:

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

     

    下面通过几个样例解说浮点数怎样转换为二进制数

    例一:

    已知:double类型38414.4

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

    分析:double类型共计64位,折合8字节。由最高到最低位各自是第636261……0位:
        
    最高位63位是符号位,1表示该数为负,0表示该数为正;
        62-52
    位,一共11位是指数位;
        51-0
    位,一共52位是尾数位。

         
    步骤:依照IEEE浮点数表示法,以下先把38414.4转换为十六进制数。
         
    把整数部和小数部分开处理:整数部直接化十六进制:960E。小数的处理:
    0.4=0.5*0+0.25*1+0.125*1+0.0625*0+……
         
    实际上这永远算不完!这就是著名的浮点数精度问题。所以直到加上前面的整数部分算够53位即可了。隐藏位技术:最高位的1不写入内存(终于保留下来的还是52位)。
        
    假设你够耐心,手工算到53位那么因该是:38414.4(10)=1001011000001110.
    0110011001100110011001100110011001100(2)

    科学记数法为:1.0010110000011100110011001100110011001100110011001100,右移了15位,所以指数为15。或者能够例如以下理解:

    1.001011000001110 0110011001100110011001100110011001100×2^15
         
    于是来看阶码,按IEEE标准一共11位,能够表示范围是-1024 ~ 1023。由于指数能够为负,为了便于计算,规定都先加上1023(2^10-1),在这里,阶码:15+1023=1038。二进制表示为:100 00001110
        
    符号位:由于38414.4为正相应 0
        
    合在一起(注:尾数二进制最高位的1不要):
    01000000 11100010 11000001 110
     01100  11001100  11001100  11001100  11001100

     

    例二:

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

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

    解法例如以下:

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

     H:    3     5    4    3    2     1   (十六进制表示)

     B:   0011  0101 0100 0011 0010  0001 (二进制表示)

            │←─────  21────→│

     

    即: 

                   1.1010101000011001000012×221

    可见,从左算起第一个121位,我们将这21为作为浮点数的小数表示,单精度浮点数float由符号位1位,指数域位k=8位,小数域位(尾数)n=23位构成,因此对上面得到的21位小数位我们还须要补上20,得到浮点数的小数域表示为:

             1 0101 0100 0011 0010 0001 00

     

    float类型的偏置量Bias=2k-1-1=28-1-1=127,但还要补上刚才由于右移作为小数部分的21位,因此偏置量为127+21=148,就是IEEE浮点数表示标准:

                              V = (-1)s×M×2E

                        E = e-Bias

    中的e,此前计算Bias=127,刚好验证了E=148-127=21

     

    148转为二进制表示为10010100,加上符号位0,最后得到二进制浮点数表示1001010010101010000110010000100,其16进制表示为:

     H:     4        A       5          5         0         C         8        4  

     B:  0100   1010   0101    0101   0000   1100  1000   0100

                        |←────      21        ─────→   |

         1|←─8   ─→||←─────       23       ─────→ |

     

    这就是浮点数3490593.0(0x4A550C84)的二进制表示。

     

  • 相关阅读:
    Network (poj1144)
    C. Hongcow Builds A Nation
    ZYB loves Xor I(hud5269)
    D. Chloe and pleasant prizes
    Game(hdu5218)
    约瑟夫环的递推方法
    Misaki's Kiss again(hdu5175)
    Exploration(hdu5222)
    B. Arpa's weak amphitheater and Mehrdad's valuable Hoses
    C. Arpa's loud Owf and Mehrdad's evil plan
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/3807776.html
Copyright © 2011-2022 走看看