zoukankan      html  css  js  c++  java
  • 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;
    }

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

    小结:

    • 浮点数与整数类型的内存表示法不同
    • 浮点数的内存表示更加复杂
    • 浮点类型可表示的范围更大
    • 浮点数是一种不精确的类型
    • 浮点类型的运算速度更慢
  • 相关阅读:
    ssh scp命令详解
    python模块与包
    python参数Sample Code
    python 多线程简介
    python virtualenv环境安装(ubuntu)
    python pip 代理设置
    mysql资源总结
    mysql索引原理及用法
    Oracle学习笔记:利用user_segments查表的大小
    Oracle学习笔记:dba_tables、all_tables、user_tables区别
  • 原文地址:https://www.cnblogs.com/luojianyi/p/9198985.html
Copyright © 2011-2022 走看看