• C语言进阶——浮点数的秘密03


    浮点数在内存中的储存方式为:符号位 指数位 尾数

    • float和double类型的数据在计算机内部的表实方法是一样的,但是由于所占的存贮空间的不同,其分别能表示的数值范围和精度不同。
    类型 f符号位 指数 尾数
    float 1位(第31位) 8位(第23位--30位) 23位(第0--22位)
    double 1位(第63位) 11位(第52位--62位) 52位(第0--51位)

    浮点数的转换:

    • 将浮点数转化位二进制
    • 用科学计数法表实二进制浮点数
    • 计算指数偏移后的值

    rember:计算指数的时候需要加上一个偏移量,但是偏移量和类型是有关系的:

      对于指数6:

    • float:127+6=133
    • double:1023+6=1029

    实数8.25在内存中的float表实:8.25的二进制表实:1000.01-》1.00001*(2^3)

    • 符号位:0
    • 指数:127+3=130-》10000010
    • 小数:00001

    内存中8.25的float表示:

    • 0 10000010 00001000000000000000000 -》0x41040000

    代码示例1:

    #include <stdio.h>
    
    int main()
    {
        float f = 8.25;
        
        unsigned int* p = (unsigned int*)&f;
        
        printf("0x%08X
    ", *p);
        
        return 0;
    }

    用float存贮8.25,然后用一个unsigned int类型的指针指向它,最后输出这个指针类容的16进制

    有趣的问题:int类型的存贮范围是 -2^31~~2^31-1,float的存贮范围是-3.4*10^38~~3.4*10^38,为什莫在内存中都是4个字节,但是存贮的范围差距这莫大?

    • float能表实的具体数字的个数与int是相同的
    • float可表示的数字不是连续的,存在间隙
    • float只是一种近似的表实法,不能作为精确数使用
    • 由于float内存表实相对复杂。float的运算速度比int慢一些
    • 注意:double与float具有相同的内存表示法,因此double也是不精确的。由于double占用的内存较多,所能表示的精度比float要高

    代码示例2:

    #include <stdio.h>
    
    int main()
    {
     
        float f = 3.1415f;
        float fl = 123456789;
        
        printf("%0.10f
    ", f);
        printf("%0.10f
    ", fl);
        
        return 0;
    }

    为什莫输出结果会折磨奇怪呢,就是因为浮点数不是精确的,它是不连续的存在间隙

    小结:

    • 浮点数与整数类型的内存表示法不同
    • 浮点数的内存表示更加复杂
    • 浮点类型可表示的范围更大
    • 浮点数是一种不精确的类型
    • 浮点类型的运算速度更慢
  • 相关阅读:
    程序员过年必备 -- Auto.js微信自动抢红包
    VSCode, Django, and Anaconda开发环境集成配置[Windows]
    pandas to_excel 修改excel样式以及格式
    hvac系统开源项目情况匠能智控
    安卓作业(有空再整理)
    在jetson nano中配opencv环境(python通用)
    获取深度图像
    英伟达开发板安装python-opencv下的问题
    在vs2015中对kinectV2环境搭建,环境配置
    PagerSlidingTabStrip 导入 Android Studio 的教程
  • 原文地址:https://www.cnblogs.com/luojianyi/p/9198985.html
Copyright © 2020-2023  润新知