C语言中浮点型分为单精度浮点型 float、双精度浮点型double和long double。其中long double是C99标准新增加的。
不同平台、编译器可能会有些差异,这里以win10 x64为例
- float:占用4个字节(Byte),即32个二进制位(Bit)
- double:占用8个字节(Byte),即64个二进制位(Bit)
- long double:占用16个字节(Byte),即128个二进制位(Bit)
一般来说:long double >= double >= float
另外可引入头文件float.h来打印输出浮点型的最大取值及最小取值范围
具体演示可以看下面的代码片段
单精度float
#include <stdio.h> //预处理语句,引入标准输入输出头文件
#include <float.h> //浮点型头文件
/*
时间:2022/3/29
作者:sgbl888
功能:浮点型float的相关知识
知识点:
1、float为单精度浮点型,有效精度为6~7位(含整数部分),后面就不能保证正确了
2、float占用4个字节,可用sizeof关键字测量一下
3、float类型不能加signed或unsigned表示有符号或无符号
4、把一个整型转换为float类型
5、只输出部分小数位
*/
int main(){
//测试把浮点型数值赋值给整型,实际场景这样使用会导致数据错误
int f1 = 1.234567; //1
int f2 = 0.000001; //0
int f3 = 365.12345; //365
printf("f1 = %d\t f2 = %d\t f3 = %d\n", f1, f2, f3); //结果只保留了整数部分
printf("-----------------\n");
//定义float类型数据
float f4 = 1.234567;
float f5 = 0.0000001; //整体已经超出7位了,因此不能正确显示
float f6 = 365.12345; //输出已经超出7位了,因此只能显示365.123444(第8位的5就不正确了)
printf("f4=%f \tf5=%f \tf6=%f \n", f4, f5, f6);
printf("-----------------\n");
//sizeof关键字测量float的占用字节
printf("float type use %hd Byte\n", sizeof(float)); //结果为4(即64Bit位)
//引入头文件float.h,打印输出float类型最大值和最小值
printf("float max: %f\t float min: %f\n", FLT_MAX, FLT_MIN); //340282346638528860000000000000000000000.000000 ~ 0.000000
float f7 =340282346638528860990000000000000000099.02; //只能显示整数前面的部分
printf("f7 = %f\n", f7);
printf("-----------------\n");
//把一个整型转换为float类型
float f8 = (float) f1;
printf("f8 = %f\n", f8); //结果1.000000 为什么呢?因为f1是 int,把1转换就得到这个结果
printf("-----------------\n");
//输出部分小数位
printf("f4 = %.2f\n", f4); //只保留2位小数,结果为1.23
return 0; //返回给操作系统内核,0表示正常退出
}
双精度double:
#include <stdio.h>
#include <float.h> //浮点型头文件
/*
时间:2022/3/29
作者:sgbl888
功能:学习double类型的相关知识
知识点:
1、双精度浮点型double
2、比double更大还有long double(C99标准新增)
3、double、long double的最大、最小取值范围
*/
int main(){
//sizeof关键字测试double占用字节
printf("double type use %hd Byte\n", sizeof(double)); //占用8个字节,也就64位二进制位
printf("long double type use %hd Byte\n", sizeof(long double));
//double、long double的最大、最小取值范围
printf("double max:%lf double min:%lf\n", DBL_MAX, DBL_MIN);
printf("long double max:%Le long double min:%Le\n", LDBL_MAX, LDBL_MIN);
printf("--------------\n");
//定义double变量
double d1 = 12345.987654321012345678908888;
printf("d1 = %.16lf\n", d1); //printf默认只输出6位小数。
return 0;
}