2 浮点数

内存中的浮点数

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

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

浮点数存储示例

  • 浮点数的转换

    • 将浮点数转换成二进制

    • 用科学计数法表示二进制浮点数

    • 计算指数偏移后的指

    • 注意:计算指数时,需要加上偏移量,偏移量的值与类型有关

      如:对于指数6,偏移后的指如下:

      float :127+6 -> 133

      double :1023+6 -> 1029

  • 示例:实数8.25在内存中的 float 表示

    • 8.25的二进制表示:1000.01 -> 1.00001*(2^3)
    • 符号位:0
    • 指数:127+3 ->130 -> 1000 0010
    • 小数:00001
    • 内存中8.25的 float 表示为:0 10000010 00001000000000000000000 -> 0x41040000
    #include <stdio.h>
    int main()
    {
    	float f = 8.25;
    	unsigned int* p = (unsigned int*)&f;
        //%08x为整型以16进制方式输出的格式字符串,会把后续对应参数的整型数字,以16进制输出。08的含义为,输出的16进制值占8位,不足部分左侧补0。
    	printf("0x%08X
    ", *p);
    
    	return 0;
    }
    
    //输出结果:
    0x41040000
    

int 和 float 表示的范围

  • int 类型的范围:([-2^{31},2^{31}-1])

  • float 类型的范围:([-3.4*10^{38},3.4*10^{38}])

  • intfloat 都占4个字节的内存,为什么 float 却比 int 的范围大得多?

    • float 能表示的具体数字的个数int 相同
    • float 可表示的数字之间不是连续的,存在间隙
    • float 只是一种近似的表示法,不能作为精确数使用
    • 由于内存表示法相对复杂,float 的运算速度比 int 慢得多
    #include <stdio.h>
    
    int main()
    {
    	float f = 3.1415f;
    	float f1 = 123456789;
    
    	printf("%0.10f
    ", f);
    	printf("%0.10f
    ", f1);
    
    	return 0;
    }
    
    //输出结果:
    3.1414999962
    123456792.0000000000
    
原文地址:https://www.cnblogs.com/bky-hbq/p/13582418.html