国际访客建议访问 Primers 编程伙伴 国际版站点 > C 教程 > float.h 以获得更好的体验。

# C 语言标准库头文件 float.h

请查看 C 语言标准库头文件列表 了解更多相关 API。

这个头文件提供 浮点数类型的范围 的相关功能,例如获取浮点数的最大值、最小值、最小单位等。

# 示例

#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 是否支持非正规数

# 推荐阅读

本文 更新于: 2025-11-27 09:38:06 创建于: 2025-11-27 09:38:06