【07】C语言中的浮点类型详解
【07】C语言中的浮点类型详解
文章目录
- 1. 基本浮点类型
- 1.1 float(单精度浮点型)
- 1.2 double(双精度浮点型)
- 1.3 long double(扩展精度浮点型)
- 2. 浮点数的表示
- 2.1 浮点数的特性
- 2.2 浮点数的使用
- 2.3 代码示例
- 3. 浮点数的输入输出
C语言提供了三种主要的浮点类型,每种类型有不同的精度和范围。
1. 基本浮点类型
1.1 float(单精度浮点型)
- 大小:通常4字节(32位)
- 精度:约6-7位有效数字
- 范围:约±1.2×10⁻³⁸到±3.4×10³⁸
- 后缀:f或F(如3.14f)
- 示例:
float pi = 3.1415926f;
1.2 double(双精度浮点型)
- 大小:通常8字节(64位)
- 精度:约15-16位有效数字
- 范围:约±2.3×10⁻³⁰⁸到±1.7×10³⁰⁸
- 默认类型:浮点字面量默认为
double - 示例:
double distance = 149.6e6; // 科学计数法表示地球到太阳的距离(1.496亿公里)
1.3 long double(扩展精度浮点型)
- 大小:通常10字节(80位)或16字节(128位),取决于具体的编译器和平台实现。
- 精度:至少与
double相同,通常更高 - 范围:比
double更大 - 后缀:L或l
- 示例:
long double precise_value = 3.141592653589793238L;
2. 浮点数的表示
浮点数在内存中按照IEEE 754标准(大多数平台)存储,分为三个部分:
- 符号位(1位):0表示正数,1表示负数
- 指数部分:存储科学计数法中的指数
- 尾数部分:存储有效数字
2.1 浮点数的特性
-
精度问题:
float a = 0.1f; float b = 0.2f; float c = a + b; printf("%.20f\n", c); // 可能输出0.30000001192092895508而不是精确的0.3 -
特殊值:
- 无穷大(INFINITY):
inf - 非数字(NaN):
nan - 可以使用
<math.h>中的宏如isinf()和isnan()检测
- 无穷大(INFINITY):
-
舍入误差:
- 浮点数运算可能产生舍入误差
- 比较浮点数时不应使用
==,而应比较差值是否小于某个小值(如1e-6)
2.2 浮点数的使用
- 默认使用
double,除非有特殊的内存限制。 - 避免直接比较浮点数是否相等。
- 注意浮点运算的精度损失。
- 科学计算使用
long double可获得更高精度。 - 使用标准库函数(如
<math.h>)进行数学运算。
2.3 代码示例
#include <stdio.h>
#include <math.h>
#include <float.h>int main() {// 打印各类型的范围和精度信息printf("float 大小: %zu 字节\n", sizeof(float));printf("float 最小正值: %e\n", FLT_MIN);printf("float 最大值: %e\n", FLT_MAX);printf("float 精度位数: %d\n", FLT_DIG);printf("\ndouble 大小: %zu 字节\n", sizeof(double));printf("double 最小正值: %e\n", DBL_MIN);printf("double 最大值: %e\n", DBL_MAX);printf("double 精度位数: %d\n", DBL_DIG);// 浮点数运算示例double x = 0.1;double y = 0.2;double z = x + y;printf("\n0.1 + 0.2 = %.20f\n", z); // 显示精度问题// 正确的浮点数比较方法if (fabs(z - 0.3) < DBL_EPSILON) {printf("0.1 + 0.2 等于 0.3 (在浮点精度范围内)\n");} else {printf("0.1 + 0.2 不等于 0.3 (由于浮点精度限制)\n");}// 特殊浮点值double inf = 1.0 / 0.0;double nan = 0.0 / 0.0;printf("\n无穷大: %f\n", inf);printf("非数字: %f\n", nan);// 检测特殊值printf("isinf(inf): %d\n", isinf(inf));printf("isnan(nan): %d\n", isnan(nan));return 0;
}
输出结果:
float 大小: 4 字节
float 最小正值: 1.175494e-38
float 最大值: 3.402823e+38
float 精度位数: 6double 大小: 8 字节
double 最小正值: 2.225074e-308
double 最大值: 1.797693e+308
double 精度位数: 150.1 + 0.2 = 0.30000000000000004441
0.1 + 0.2 等于 0.3 (在浮点精度范围内)无穷大: inf
非数字: nan
isinf(inf): 1
isnan(nan): -1
3. 浮点数的输入输出
- 使用
%f格式化输出float和double - 使用
%Lf格式化输出long double - 使用科学计数法输出:
%e或%E - 自动选择最短表示:
%g或%G
double d = 123.456;
printf("%f\n", d); // 123.456000
printf("%.2f\n", d); // 123.46
printf("%e\n", d); // 1.234560e+02
printf("%g\n", d); // 123.456
输出结果:
123.456000
123.46
1.234560e+02
123.456
