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.小结
浮点类型与整数类型的内存表示法不同
浮点类型的内存表示更复杂
浮点类型可以表示的范围更大
浮点类型是一种不精确的类型
浮点类型是运算速度较慢 |