这个头文件提供 浮点数类型的范围 的相关功能,例如获取浮点数的最大值、最小值、最小单位等。
#include <stdio.h>
#include <float.h>
#include <math.h>
void print_float_properties() {
printf("\n=== float (32-bit) 属性 ===\n");
printf("FLT_RADIX (基数): %d\n", FLT_RADIX);
printf("FLT_MANT_DIG (尾数位数): %d\n", FLT_MANT_DIG);
printf("FLT_DIG (十进制精度): %d\n", FLT_DIG);
printf("FLT_MIN_EXP (最小指数): %d\n", FLT_MIN_EXP);
printf("FLT_MAX_EXP (最大指数): %d\n", FLT_MAX_EXP);
printf("\n-- 范围 --\n");
printf("FLT_MIN (最小正规化正数): %e\n", FLT_MIN);
printf("FLT_TRUE_MIN (最小正非零值): %e\n", FLT_TRUE_MIN);
printf("FLT_MAX (最大有限正数): %e\n", FLT_MAX);
printf("\n-- 精度 --\n");
printf("FLT_EPSILON (1与大于1的最小值差): %e\n", FLT_EPSILON);
printf("FLT_DECIMAL_DIG (无损十进制位数): %d\n", FLT_DECIMAL_DIG);
printf("\n-- 特殊值 --\n");
printf("INFINITY (无穷大): %f\n", INFINITY);
printf("NAN (非数字): %f\n", NAN);
}
void print_double_properties() {
printf("\n=== double (64-bit) 属性 ===\n");
printf("DBL_MANT_DIG (尾数位数): %d\n", DBL_MANT_DIG);
printf("DBL_DIG (十进制精度): %d\n", DBL_DIG);
printf("DBL_MIN_EXP (最小指数): %d\n", DBL_MIN_EXP);
printf("DBL_MAX_EXP (最大指数): %d\n", DBL_MAX_EXP);
printf("\n-- 范围 --\n");
printf("DBL_MIN (最小正规化正数): %e\n", DBL_MIN);
printf("DBL_TRUE_MIN (最小正非零值): %e\n", DBL_TRUE_MIN);
printf("DBL_MAX (最大有限正数): %e\n", DBL_MAX);
printf("\n-- 精度 --\n");
printf("DBL_EPSILON (1与大于1的最小值差): %e\n", DBL_EPSILON);
printf("DBL_DECIMAL_DIG (无损十进制位数): %d\n", DBL_DECIMAL_DIG);
}
void print_ldouble_properties() {
printf("\n=== long double 属性 ===\n");
printf("LDBL_MANT_DIG (尾数位数): %d\n", LDBL_MANT_DIG);
printf("LDBL_DIG (十进制精度): %d\n", LDBL_DIG);
printf("LDBL_MIN_EXP (最小指数): %d\n", LDBL_MIN_EXP);
printf("LDBL_MAX_EXP (最大指数): %d\n", LDBL_MAX_EXP);
printf("\n-- 范围 --\n");
printf("LDBL_MIN (最小正规化正数): %Le\n", LDBL_MIN);
printf("LDBL_TRUE_MIN (最小正非零值): %Le\n", LDBL_TRUE_MIN);
printf("LDBL_MAX (最大有限正数): %Le\n", LDBL_MAX);
printf("\n-- 精度 --\n");
printf("LDBL_EPSILON (1与大于1的最小值差): %Le\n", LDBL_EPSILON);
printf("LDBL_DECIMAL_DIG(无损十进制位数): %d\n", LDBL_DECIMAL_DIG);
}
int main(void) {
printf("系统浮点数属性 (精确值):\n");
print_float_properties();
print_double_properties();
print_ldouble_properties();
// 额外补充十六进制表示
printf("\n=== 十六进制精确表示 ===\n");
printf("FLT_MIN: %a\n", FLT_MIN);
printf("FLT_TRUE_MIN: %a\n", FLT_TRUE_MIN);
printf("DBL_MIN: %a\n", DBL_MIN);
printf("DBL_TRUE_MIN: %a\n", DBL_TRUE_MIN);
return 0;
}
运行结果:
系统浮点数属性 (精确值):
=== float (32-bit) 属性 ===
FLT_RADIX (基数): 2
FLT_MANT_DIG (尾数位数): 24
FLT_DIG (十进制精度): 6
FLT_MIN_EXP (最小指数): -125
FLT_MAX_EXP (最大指数): 128
-- 范围 --
FLT_MIN (最小正规化正数): 1.175494e-38
FLT_TRUE_MIN (最小正非零值): 1.401298e-45
FLT_MAX (最大有限正数): 3.402823e+38
-- 精度 --
FLT_EPSILON (1与大于1的最小值差): 1.192093e-07
FLT_DECIMAL_DIG (无损十进制位数): 9
-- 特殊值 --
INFINITY (无穷大): inf
NAN (非数字): nan
=== double (64-bit) 属性 ===
DBL_MANT_DIG (尾数位数): 53
DBL_DIG (十进制精度): 15
DBL_MIN_EXP (最小指数): -1021
DBL_MAX_EXP (最大指数): 1024
-- 范围 --
DBL_MIN (最小正规化正数): 2.225074e-308
DBL_TRUE_MIN (最小正非零值): 4.940656e-324
DBL_MAX (最大有限正数): 1.797693e+308
-- 精度 --
DBL_EPSILON (1与大于1的最小值差): 2.220446e-16
DBL_DECIMAL_DIG (无损十进制位数): 17
=== long double 属性 ===
LDBL_MANT_DIG (尾数位数): 64
LDBL_DIG (十进制精度): 18
LDBL_MIN_EXP (最小指数): -16381
LDBL_MAX_EXP (最大指数): 16384
-- 范围 --
LDBL_MIN (最小正规化正数): 3.362103e-4932
LDBL_TRUE_MIN (最小正非零值): 3.645200e-4951
LDBL_MAX (最大有限正数): 1.189731e+4932
-- 精度 --
LDBL_EPSILON (1与大于1的最小值差): 1.084202e-19
LDBL_DECIMAL_DIG(无损十进制位数): 21
=== 十六进制精确表示 ===
FLT_MIN: 0x1p-126
FLT_TRUE_MIN: 0x1p-149
DBL_MIN: 0x1p-1022
DBL_TRUE_MIN: 0x0.0000000000001p-1022
| 宏 | 标准 | 说明 |
|---|---|---|
FLT_RADIX |
C89 | 所有三种浮点类型表示所使用的基数,通常为 2 即二进制 |
DECIMAL_DIG |
C99 | long double 在十进制和二进制浮点表示之间无损转换所需的十进制小数位数 |
FLT_DECIMAL_DIG |
C11 | float 在十进制和二进制浮点表示之间无损转换所需的十进制小数位数,至少为 6, IEEE 定义为 9 |
DBL_DECIMAL_DIG |
C11 | double 在十进制和二进制浮点表示之间无损转换所需的十进制小数位数,至少为 10, IEEE 定义为 17 |
LDBL_DECIMAL_DIG |
C11 | long double 在十进制和二进制浮点表示之间无损转换所需的十进制小数位数,至少为 10, IEEE 未定义,通常为 21 |
FLT_MIN |
C89 | float 的最小值正规化正值,通常为 \(1.175494^{-38}\),小于这个值会下溢 |
DBL_MIN |
C89 | double 的最小值正规化正值,通常为 \(2.225074^{-308}\),小于这个值会下溢 |
LDBL_MIN |
C89 | long double 的最小值正规化正值,通常为 \(3.362103^{-4932}\),小于这个值会下溢 |
FLT_TRUE_MIN |
C11 | float 的最小值正值,通常为 \(1.401298^{-45}\) |
DBL_TRUE_MIN |
C11 | double 的最小值正值,通常为 \(4.940656^{-324}\) |
LDBL_TRUE_MIN |
C11 | long double 的最小值正值,通常为 \(3.645200^{-4951}\) |
FLT_MAX |
C89 | float 的最大有限值 |
DBL_MAX |
C89 | double 的最大有限值 |
LDBL_MAX |
C89 | long double 的最大有限值 |
FLT_EPSILON |
C89 | float 的最小增量 |
DBL_EPSILON |
C89 | double 的最小增量 |
LDBL_EPSILON |
C89 | long double 的最小增量 |
FLT_DIG |
C89 | float 在文本和二进制浮点表示之间无损转换所需的十进制小数位数 |
DBL_DIG |
C89 | double 在文本和二进制浮点表示之间无损转换所需的十进制小数位数 |
LDBL_DIG |
C89 | long double 在文本和二进制浮点表示之间无损转换所需的十进制小数位数 |
FLT_MANT_DIG |
C89 | float 采用 FLT_RADIX 进制时的小数位数 |
DBL_MANT_DIG |
C89 | double 采用 FLT_RADIX 进制时的小数位数 |
LDBL_MANT_DIG |
C89 | long double 采用 FLT_RADIX 进制时的小数位数 |
FLT_MIN_EXP |
C89 | float 正规化值能使用的最小指数(以 FLT_RADIX 为底) |
DBL_MIN_EXP |
C89 | double 正规化值能使用的最小指数(以 FLT_RADIX 为底) |
LDBL_MIN_EXP |
C89 | long double 正规化值能使用的最小指数(以 FLT_RADIX 为底) |
FLT_MIN_10_EXP |
C89 | float 正规化值能使用的最小指数(以 10 为底) |
DBL_MIN_10_EXP |
C89 | double 正规化值能使用的最小指数(以 10 为底) |
LDBL_MIN_10_EXP |
C89 | long double 正规化值能使用的最小指数(以 10 为底) |
FLT_MAX_EXP |
C89 | float 正规化值能使用的最大指数(以 FLT_RADIX 为底) |
DBL_MAX_EXP |
C89 | double 正规化值能使用的最大指数(以 FLT_RADIX 为底) |
LDBL_MAX_EXP |
C89 | long double 正规化值能使用的最大指数(以 FLT_RADIX 为底) |
FLT_MAX_10_EXP |
C89 | float 正规化值能使用的最大指数(以 10 为底) |
DBL_MAX_10_EXP |
C89 | double 正规化值能使用的最大指数(以 10 为底) |
LDBL_MAX_10_EXP |
C89 | long double 正规化值能使用的最大指数(以 10 为底) |
FLT_ROUNDS |
C89 | 舍入模式,参考 fenv.h |
FLT_EVAL_METHOD |
C99 | 所有浮点运算的精度 |
FLT_HAS_SUBNORM |
C11(在 C23 废弃) | float 是否支持非正规数 |
DBL_HAS_SUBNORM |
C11(在 C23 废弃) | double 是否支持非正规数 |
LDBL_HAS_SUBNORM |
C11(在 C23 废弃) | long double 是否支持非正规数 |