跟着狄泰唐老师学C语言进阶教程的笔记之浮点数的秘密
l 浮点数在内存的存储方式为:符号位,指数,尾数
l float与double 类型的数据在计算机内部的表示法是相同的,但是由于所占用的存储空间的不同,其分别能够表示的数值范围和精度也不同
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps2B08.tmp.png
2. 浮点数存储示例l 浮点数的转换
A. 将浮点数转换为二进制
B. 用科学计数法表示二进制浮点数
C. 计算指数偏移后的值
l 示例:对于指数6,偏移后的值如下:
float:127 + 6 -->133
double:1023+ 6 -->1029
l 注意:计算指数时需要加上偏移量,而偏移量的值和类型有关,float偏移127,double偏移1023
3. 进制浮点数的内存表示l 实数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. 用程序验证l 8.25在内存中的float表示的16进制形式
int test1()
{
float f = 8.25;
unsigned int *p = (unsigned int*)&f;
printf("p=%#x", *p);
return 0;
}
5. 有趣的问题l int 类型的范围:[-2^31,(2^31)-1]
l flaot类型的范围:[-3.4*10^38,3.4*10^38]
l 思考:int和float都占用4个字节的内存,为什么float却比int的范围大得多呢?
6. 浮点数的秘密l float能表示的具体数字的个数与int相同
l float可表示的数字之间不是连续的,存在间隙
l float只是一种近似的表示法,不能作为精确数使用
l 由于内存表示法相对复杂,float的运算速度比int慢得多
l 注意: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. 小结l 浮点类型与整数类型的内存表示法不同
l 浮点类型的内存表示更复杂
l 浮点类型可以表示的范围更大
l 浮点类型是一种不精确的类型
l 浮点类型是运算速度较慢