• 深入研究浮点数在内存中的存储情况


    float类型数据占4字节。

    #include<stdio.h>
    struct DATA
    {
        unsigned char d0:1;
    
        unsigned char d1:1;
        unsigned char d2:1;
        unsigned char d3:1;
        unsigned char d4:1;
        unsigned char d5:1;
        unsigned char d6:1;
        unsigned char d7:1;
        unsigned char d8:1;
    
        unsigned char d9:1;
        unsigned char d10:1;
        unsigned char d11:1;
        unsigned char d12:1;
        unsigned char d13:1;
        unsigned char d14:1;
        unsigned char d15:1;
        unsigned char d16:1;
        unsigned char d17:1;
        unsigned char d18:1;
        unsigned char d19:1;
        unsigned char d20:1;
        unsigned char d21:1;
        unsigned char d22:1;
        unsigned char d23:1;
        unsigned char d24:1;
        unsigned char d25:1;
        unsigned char d26:1;
        unsigned char d27:1;
        unsigned char d28:1;
        unsigned char d29:1;
        unsigned char d30:1;
        unsigned char d31:1;
    }data;
    typedef union A 
    {
        float i;    // 存放十进制数
        DATA test; 
    } A;
    
    void show(float x)
    {
        A v;
        v.i = x;
        printf("%8g ==== ",x);
        printf("%d %d%d%d%d%d%d%d%d %d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d
    ",
            v.test.d31 , v.test.d30 , v.test.d29 , v.test.d28 , v.test.d27 , v.test.d26 , v.test.d25, v.test.d24 ,
            v.test.d23 , v.test.d22 , v.test.d21 , v.test.d20 , v.test.d19 , v.test.d18 , v.test.d17, v.test.d16 ,
            v.test.d15 , v.test.d14 , v.test.d13 , v.test.d12 , v.test.d11 , v.test.d10 , v.test.d9, v.test.d8 ,
            v.test.d7 , v.test.d6 , v.test.d5 , v.test.d4 , v.test.d3 , v.test.d2 , v.test.d1, v.test.d0 
            );
    }
    int main()
    {
        //
        show(-128.75f);
        return 0;
    }

    计算公式:

    x=(-1)^S*2^(E-127)*(1.M)
    S表示符号位,正或者负。 在计算机中,0表示正,1表示负
    E表示指数
    M表示小数点后的数
    ====================接下来是几个实例========================




    接下来,我们套公式:
    (-1)^S*2^(E-127)*(1.M)
    =(-1)^1*2^(134-127)*(1+0.M)
    =-( 2^7 + 2^7 * 0.M)
    =-(128 + 128 * 3/512)
    =-128.75

    ---------------------------------------------------------------------

    S的值为 0 
    E的值为 0x7B 它的十进制数是 123

    M的值为 .1111 1001 1010 0110 1011 011

    先计算二进制 111 1100 1101 0011 0101 1011 的值
    十六进制是 7 c d 3 5 b
    用计算器算出来的结果是:8180571

    由此算出:
    .1111 1001 1010 0110 1011 011 的值为  8180571/(2^23)

    接下来套公式:
     (-1)^S*2^(E-127)*(1.M)
    = (-1)^0 * 2^(123-127) * (1+0.M)
    = 2^-4 + 2^-4 * 8180571*2^-23
    =1/16 + 8180571/134217728
    =0.0625 + 0.06095000256
    =0.12345000256

    在此感谢王哥和我一起分析。











  • 相关阅读:
    成功熬了四年还没死?一个IT屌丝创业者的深刻反思
    史氏语录
    WEB安全攻防学习内容
    从程序员的角度谈创业三年
    Windows2008 R2修改3389端口教程
    Win2008R2 zip格式mysql 安装与配置
    制作支持UEFI PC的Server2008 R2系统安装U盘
    郎科U208(主控 PS2251-50 HYNIX H27UCG8T2MYR)量产还原
    自用有线IP切换
    自动配置IP地址.bat
  • 原文地址:https://www.cnblogs.com/dzqdzq/p/3213825.html
Copyright © 2020-2023  润新知