知识点一:浮点数据类型
1)浮点数据类型包括float(单精度浮点型),double(双精度浮点型),long double(长精度浮点型)。
2)由于小数位置可以浮动,所以实数的指数形式称为浮点数。
3)由于用二进制形式表示一个实数以及存储单元的长度是有限的,因此不可能得到完全精确的值,只能存储成有限的精确度。小数部分占的为(bit)数愈多,数的有效数字愈多,精确度也就愈高。指数部分占位数愈多,则能表示的数值范围愈大。
知识点二:浮点数取值范围
知识点三:浮点数表示形式
1)十进制小数形式:由数字和小数点组成;
例:3.14,4.,.4,.0,0.
2)指数形式:“十进制小数或整数”+“e(或E)"+"十进制整数”,e(或E)的两边必须有数,不能省略。
例:3.5-4表示3.5*10*(-4),5.4E+8
3)单精度浮点数类型小数点后有效的位数只有6位;
4)双精度浮点数类型的有效位数可以达到16位;
5)绝大多数C编译器都规定小数点后最多保留6位,其余部分四舍五入;
知识点四:浮点数定义
通过类型定义符,可以定义一个浮点数类型的变量,与定义整数变量的方法相同;
【类型定义符】标识符;
float fnum; double fnum;
浮点类型变量也可以使用printf()函数输出,与整型变量不同的是:float的格式说明项为“%f”;double的格式说明项为“%f"。
知识点五:处理带小数的数值
#include <stdio.h>
int main()
{
int a = 1.234567;
int b = 0.00001;
int c = 365.12345;
printf("%d\n", a);
printf("%d\n", b);
printf("%d\n", c);
return 0;
}
其结果为1 0 365.即小数部分丢失;
1)我们把上面代码中的整型 int ,用单精度浮点型 float 替代。 之后,再将 printf("%d\n",a); 中的占位符是 %d ,所以我们用 %f 替换。( %d 占位符用于整型, %f 占 位符用于浮点型);
#include <stdio.h>
int main()
{
float a = 1.234567;
float b = 0.00001;
float c = 365.12345;
printf("%f\n", a);
printf("%f\n", b);
printf("%f\n", c);
return 0;
}
结果:1.2345567
0.000010
365.123444
2) 将 int 替换成 float 之后,大部分的数据都是正确的。但是 365.12345 变成了 365.123444 ,很明显精度出 现了误差。 这是因为,浮点数并不能表示无限的精确,它会存在着一定的误差;
3)C标准规定,float类型必须至少能表示6位有效数字,并且取值范围至少是10^-37~10+37。所以,使用float来装365.12345时,前面六位数值是准确的,但是后面的数值略有误差;
4)我们把上面代码中的 float 换 成 double;
#include <stdio.h>
int main()
{
double a = 1.234567;
double b = 0.00001;
double c = 365.12345;
printf("%f\n", a);
printf("%f\n", b);
printf("%f\n", c);
return 0;
}
结果:1.234567
0.000010
365.123450
此次365.12345 也是正确的了;
*double 类型也是有精度范围的。如果是更高精度的数据, double 也会出现误差;
知识点六:浮点类型所占字节大小
#按照我们之前对整型的经验,越大范围的整型类型所占的空间越大。 那么对于浮点类型来说,越高精度、越大范围的浮点类型,应该也会占用越大的空间。 我们用sizeof来测量一下float和double分别占用多大的空间。
#include <stdio.h>
int main()
{
printf("sizeof float = %d\n", sizeof(float));
printf("sizeof double = %d\n", sizeof(double));
return 0;
}
结果;sizeof float=4
sizeof double=8
#float , double 分别为4,8个字节。验证了我们之前对于越大范围,越高精度的类型所占空间越大的设想.