c语言中浮点数有两种类型:float,double。他们在计算机内部的表示法相同,只有占用内存大小不同。float占4个字节,double占8个字节,所以表示的精度也不同。
浮点数在内存里表示法为符号位,指数,尾数(小数部分)
浮点数的小数位在内存里用2的负次幂的和表示,
1.能用有限位数表示的数(0.5,0.25,...的和得数)
比如10进制0.75 = 二进制 0.11 因为0.75是0.5和0.25的和。
2.不能用有限位数表示的数
比如0.1 = 二进制0.00011001....(这里可以看出浮点数并不精确)
浮点数的转换
1 .将浮点数转换为二进制
2.用科学计数法表示二进制浮点数
3.计算指数偏移后的值。
注意计算偏移值时要加上偏移量,而偏移量的值与类型有关,
对于指数3,偏移值如下
float 127+3 = 130
double 1023+3 = 1026;
举个例子8.25,用float表示
1,转换为2进制 1000.01
2,科学计数法1.00001*(2^3)
3,计算偏移值 127+3 = 130 = 10000010
符号0,指数10000010 小数00001
所以为0 10000010 00001000000000000000000 = 0x41040000
在int 和 float 中,他们占的内存一样但是表示的数的范围却不一样int【-2^31,2^31-1】
float【-3.4*10^38,3.4*10^38】。
1.float和int 表示的数的个数是一样的;
2.float的表示的数不是连续的,存在间隙(原因是不能用有限表示的数比如0.1 = 二进制0.00011001……);
3.float只是一种近似的表示法,不是精确的表示
4.由于表示复杂,所以运算速度比整型慢
double同理。
代码验证
int main()
{
float f = 3.1415f;
float fl = 123456789;
printf("%0.10f\n", f);
printf("%0.10f\n", fl);
return 0;
}
学习交流群199546072