打印

跟着狄泰唐老师学C语言进阶教程的笔记之浮点数的秘密

[复制链接]
794|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Damon_1|  楼主 | 2017-5-19 13:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1.内存中的浮点数
浮点数在内存的存储方式为:符号位,指数,尾数
float与double 类型的数据在计算机内部的表示法是相同的,但是由于所占用的存储空间的不同,其分别能够表示的数值范围和精度也不同

2.浮点数存储示例
浮点数的转换
A.将浮点数转换为二进制
B.用科学计数法表示二进制浮点数
C.计算指数偏移后的值
示例:对于指数6,偏移后的值如下:
        float:127 + 6 -->133
        double:1023+ 6 -->1029
注意:计算指数时需要加上偏移量,而偏移量的值和类型有关,float偏移127,double偏移1023
3.进制浮点数的内存表示
实数8.25的内存中的float表示
A.8.25的二进制:1000.01-->1.00001*(2^3)
B.符号位:0 (正数)
C.指数:127 + 3 -->130 -->10000010
D.小数:00001
8.25的flaot类型表示:0 10000010 00001000000000000000000  
符号位(1位)   指数位(8位)                   尾数(23位)             16进制形式
            0      10000010     00001000000000000000000  --> 0x41040000
4.用程序验证
8.25在内存中的float表示的16进制形式
int test1()
{
        float f = 8.25;
        unsigned int *p = (unsigned int*)&f;
        printf("p=%#x", *p);
        return 0;
}
5.有趣的问题
int 类型的范围:[-2^31,(2^31)-1]
flaot类型的范围:[-3.4*10^38,3.4*10^38]
思考:int和float都占用4个字节的内存,为什么float却比int的范围大得多呢?
6.浮点数的秘密
float能表示的具体数字的个数与int相同
float可表示的数字之间不是连续的,存在间隙
float只是一种近似的表示法,不能作为精确数使用
由于内存表示法相对复杂,float的运算速度比int慢得多
注意:double与float具有相同的内存表示法,因此double也是不精确的,由于double占用的内存较多,所能表示的精度比flaot高。
7.浮点数是不精确的
int test2()
{
        float f = 3.14159;
        float f2 = 123456789;
        printf("f=%.10f\n",f); //3.1415901184
        printf("f=%.10f\n", f2);//123456792.0000000000
        return 0;
}
8.小结
浮点类型与整数类型的内存表示法不同
浮点类型的内存表示更复杂
浮点类型可以表示的范围更大
浮点类型是一种不精确的类型
浮点类型是运算速度较慢

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

10

帖子

1

粉丝