• 浮点数内存存储问题


    先来看一下整数的存储

    比如int i = 1,看一下它的实际内存存放 

    那我们在来看一下浮点数的存储

    浮点数不是像整数那样直接就可以以二进制的形式在内存存放的,他会按照一个标准解析之后,在存放到内存中

    比如一个浮点数是19.625

    它的二进制形式则是:10011.101

    它的内存分布可不是如下分布的

     一般我们会将这个浮点数先变成如下形式:

     也就是按照指数的形式存放在内存之中

    那么19.625变成上面这种形式就是

    还是先看它的二进制:10011.101

    那么小数点左移四位:1.0011101 * 2 ^4

    这个就是存放在内存中形式,那么具体是怎么按位存的呢

    先来看一下,单双精度浮点数的一个按位存储规则

     大致意思就是

     

    针对于这个数:1.0011101 * 2 ^4

    符号位:0,因为是正数嘛

    尾数位:0011101,小数点后面的位数嘛,那小数点前面这个1呢,直接舍弃就行,哈哈

    这里说一下阶码:

            阶码 = 阶数 + 偏移量

                    阶数 = 指数,这里指数就是4,二进制就是100

                    计算偏移量首先我们必须知道下面两个信息

                           1.单精度的阶码位数 8

                           2.双精度的阶码位数11

                    我们必须知道阶码位数,才能算偏移量,那么偏移量怎么计算?

                    2^e-1 - 1,这里e就是阶码的位数。

                    那么单精度的偏移量就是:2^7 - 1 = 128 -1 =127,双精度的偏移量就是:2^11 - 1= 1024 - 1 = 1023

               综上所述:这里的阶码 = 4 + 127(这里我当成单精度浮点数) = 131 ,二进制就是:10000011

    所以19.625的实际内存分布形式就是

    OK,然后我们把它放到内存又是怎么存放的呢?

             在考虑存放的时候,还是要注意低位存放在低字节,高位存放在高字节,还要注意,数据的存储顺序(低位从左往右存)与解析顺序(从右往左解析)

            

    上代码,我们去看一下内存

    1. #include
    2. #include
    3. void main()
    4. {
    5. float num = 19.625f;
    6. printf("%p", &num);
    7. system("pause");
    8. return 0;
    9. }

     去内存看一下

     下面我说一下负浮点数的存储,还是拿19.625来说

    定义一个数据类型float num = -19.625

    直接上代码,然后看内存

    1. #include
    2. #include
    3. void main()
    4. {
    5. float num = -19.625f;
    6. printf("%p", &num);
    7. system("pause");
    8. return 0;
    9. }

    内存:

    这里怎么变成c1了?

    我们还是来看一下内存分布图

    换句话说,负浮点数就是把源码直接存放。

    下面再来说一个问题,精度缺失问题,比如10.6,这个小数部分的0.6,我们要变成二进制就是

    0.6 * 2 = 1.2

    0.2 * 2 = 0.4

    0.4 * 2 = 0.8

    0.8 * 2 = 1.6

    0.6....开始循环1001

    对于内存来说,是不允许这样一直循环下去的,所以 ,在相应有限的空间里面,只能存放一定的数据,后面的就直接丢失,所以,这也是小数为什么会造成一定的误差的原因

     

  • 相关阅读:
    javaWebssh在线授课辅导系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计
    MySQL高阶语句
    React 学习-6-列表 & keys
    Appium+Java多台设备连接时实现设备切换
    Linux安装Redis(详细教程)
    【数据结构】栈和队列的实现(C语言)
    [附源码]计算机毕业设计JAVA乡村振兴惠农推介系统
    CUDA中的存储空间修饰符
    vue3在main.js里面定义全局函数,然后其他页面使用
    CE修改器入门:运用代码注入
  • 原文地址:https://blog.csdn.net/Pxx520Tangtian/article/details/126028206