C 语言中的浮点数类型的特征由描述浮点数表示的以下模型定义:
对于 C 语言标准规定的浮点数类型特征,遵循标准的实现必须让这些值在绝对值上大于 / 小于或等于标准值,但符号保持不变。我们以 C11 为例,给出 C 语言标准中对浮点型特征的定义。同时,作为对比,也会给出 64 位环境 Ubuntu 16.04 系统(以下简称 U16_x64)中定义的实际值。
注:U16_x64 使用的 gcc 版本是 5.4.0,浮点型特征的定义位于头文件
/usr/lib/gcc/x86_64-linux-gnu/5/include/float.h。
- 指数表达式的基数(b)
宏定义 | FLT_RADIX |
C11 的规定 | 2 |
U16_x64 的实现 | 2 |
- 浮点有效位中以 FLT_RADIX 为基数的有效位数(p)
宏定义 | FLT_MANT_DIG |
C11 的规定 | |
U16_x64 的实现 | 24 |
宏定义 | DBL_MANT_DIG |
C11 的规定 | |
U16_x64 的实现 | 53 |
宏定义 | LDBL_MANT_DIG |
C11 的规定 | |
U16_x64 的实现 | 64 |
- 十进制位数 n,满足条件:任何 p 位以 b 为基数的浮点数可与这 n 位十进制浮点数相互转化,否则使用值(b 不是 10 的幂,结果向上圆整)
宏定义 | FLT_DECIMAL_DIG |
C11 的规定 | 6 |
U16_x64 的实现 | 9 |
宏定义 | DBL_DECIMAL_DIG |
C11 的规定 | 10 |
U16_x64 的实现 | 17 |
宏定义 | LDBL_DECIMAL_DIG |
C11 的规定 | 10 |
U16_x64 的实现 | 21 |
- 十进制位数 n,满足条件:任何最宽范围的位以 b 为基数的浮点数可与这 n 位十进制浮点数相互转化,否则使用值(b 不是 10 的幂,结果向上圆整)
宏定义 | DECIMAL_DIG |
C11 的规定 | 10 |
U16_x64 的实现 | 21 |
- 十进制位数 q,满足条件:这 q 位十进制浮点数可与任何 p 位以 b 为基数的浮点数相互转化,否则使用值(b 不是 10 的幂,结果向下圆整)
宏定义 | FLT_DIG |
C11 的规定 | 6 |
U16_x64 的实现 | 6 |
宏定义 | DBL_DIG |
C11 的规定 | 10 |
U16_x64 的实现 | 15 |
宏定义 | LDBL_DIG |
C11 的规定 | 10 |
U16_x64 的实现 | 18 |
- 满足以下条件的最小负整数:FLT_RADIX 的次幂仍然是规范化浮点数
宏定义 | FLT_MIN_EXP |
C11 的规定 | |
U16_x64 的实现 | -125 |
宏定义 | DBL_MIN_EXP |
C11 的规定 | |
U16_x64 的实现 | -1021 |
宏定义 | LDBL_MIN_EXP |
C11 的规定 | |
U16_x64 的实现 | -16381 |
- 满足以下条件的最小负整数:10 的该次幂仍然是规范化浮点数(,结果向上圆整)
宏定义 | FLT_MIN_10_EXP |
C11 的规定 | -37 |
U16_x64 的实现 | -37 |
宏定义 | DBL_MIN_10_EXP |
C11 的规定 | -37 |
U16_x64 的实现 | -307 |
宏定义 | LDBL_MIN_10_EXP |
C11 的规定 | -37 |
U16_x64 的实现 | -4931 |
- 满足以下条件的最大整数:FLT_RADIX 的次幂仍然是可表示的有限浮点数
宏定义 | FLT_MAX_EXP |
C11 的规定 | |
U16_x64 的实现 | +128 |
宏定义 | DBL_MAX_EXP |
C11 的规定 | |
U16_x64 的实现 | +1024 |
宏定义 | LDBL_MAX_EXP |
C11 的规定 | |
U16_x64 的实现 | +16384 |
- 满足以下条件的最大整数:10 的该次幂仍然是可表示的有限浮点数(,结果向下圆整)
宏定义 | FLT_MAX_10_EXP |
C11 的规定 | +37 |
U16_x64 的实现 | +38 |
宏定义 | DBL_MAX_10_EXP |
C11 的规定 | +37 |
U16_x64 的实现 | +308 |
宏定义 | LDBL_MAX_10_EXP |
C11 的规定 | +37 |
U16_x64 的实现 | +4932 |
- 可表示的最大有限浮点数()
宏定义 | FLT_MAX |
C11 的规定 | 1E+37 |
U16_x64 的实现 | 3.402823E+38 |
宏定义 | DBL_MAX |
C11 的规定 | 1E+37 |
U16_x64 的实现 | 1.797693E+308 |
宏定义 | LDBL_MAX |
C11 的规定 | 1E+37 |
U16_x64 的实现 | 1.189731E+4932 |
- 1 与大于 1 的最小可表示值之间的差值()
宏定义 | FLT_EPSILON |
C11 的规定 | 1E-5 |
U16_x64 的实现 | 1.192093E-07 |
宏定义 | DBL_EPSILON |
C11 的规定 | 1E-9 |
U16_x64 的实现 | 2.220446E-16 |
宏定义 | LDBL_EPSILON |
C11 的规定 | 1E-9 |
U16_x64 的实现 | 1.084202E-19 |
- 最小的规范化正浮点数()
宏定义 | FLT_MIN |
C11 的规定 | 1E-37 |
U16_x64 的实现 | 1.175494E-38 |
宏定义 | DBL_MIN |
C11 的规定 | 1E-37 |
U16_x64 的实现 | 2.225074E-308 |
宏定义 | LDBL_MIN |
C11 的规定 | 1E-37 |
U16_x64 的实现 | 3.362103E-4932 |
- 最小正浮点数
宏定义 | FLT_TRUE_MIN |
C11 的规定 | 1E-37 |
U16_x64 的实现 | 1.401298E-45 |
宏定义 | DBL_TRUE_MIN |
C11 的规定 | 1E-37 |
U16_x64 的实现 | 4.940656E-324 |
宏定义 | LDBL_TRUE_MIN |
C11 的规定 | 1E-37 |
U16_x64 的实现 | 3.645200E-4951 |