问过关于java 里的关于浮点数表示的问题:s·m·2e-150
 int s = ((bits >> 31) == 0) ? 1 : -1;
 int e = ((bits >> 23) & 0xff);
 int m = (e == 0) ?
                 (bits & 0x7fffff) << 1 :
                 (bits & 0x7fffff) | 0x800000;
现在主要就是上面第一行里的指数部分里的-150是怎么出来的?
请教各位

解决方案 »

  1.   

    这个需要分析float型数据的存储结构,找找这方面的资料就明白了
      

  2.   

    分析了一下是这样,float型数据占32位。
    bit31是符号位,bit30-23是指数部分,bit22-bit0是尾数部分
    比如:3.1415926
    转换成二进制是11.00100100001111110110100110100010010110110000100101
    只截取24位11.0010010000111111011010=110010010000111111011010*2^-22
    -22+150=128
    所以指数部分是128,10000000,符号位是0
    整体就是
    01000000010010010000111111011010
    //----------------
    按照这个思路,就得出
        int s = ((n >> 31) == 0) ? 1 : -1;
        int e = ((n >> 23) & 0xff);
        int m = (e == 0) ? (n & 0x7fffff) << 1 : (n & 0x7fffff) | 0x800000;
    n=s * m * Math.pow(2, e - 150)
      

  3.   

    上面的s,e,m,都是用2进制表示的,也就是说-150是一个幂!
      

  4.   

    进一步的分析可知,这个150直接影响了float的表示范围
    假设这个值为m,则float的表示范围为[2^(-m+1),2^(255+24-m-1)]
    令m=150,则范围为
    [2^(-149),2^128]-->
    [1.4012984643248170709237295832899e-45,3.4028236692093846346337460743177e+38]