浮点模型和浮点宏的关系
以下模型描述了一个满足ISO/IEC 9899:2024标准最低要求的人工浮点表示(artificial floating-point representation)。
(注:人工浮点表示并不是指某个特定硬件(例如:Intel x86。)上真实的IEEE 754标准浮点数格式,而是标准文档为了阐述概念而设计的一个假设的、简化的格式。人工浮点表示的目的是用来说明:只要一种浮点表示法满足标准规定的一系列最低要求(例如:精度、范围等。),就认为是符合标准的实现。)
对于float类型,<float.h>头文件中对应的宏分别为:
| FLT_RADIX | 16 |
| FLT_MANT_DIG | 6 |
| FLT_EPSILON | 9.53674316E-07F |
| FLT_DECIMAL_DIG | 9 |
| FLT_DIG | 6 |
| FLT_MIN_EXP | -31 |
| FLT_MIN | 2.93873588E-39F |
| FLT_MIN_10_EXP | -38 |
| FLT_MAX_EXP | +32 |
| FLT_MAX | 3.40282347E+38F |
| FLT_MAX_10_EXP | +38 |
以下模型分别描述了满足ISO/IEC 60559标准中32位二进制数和64位二进制数要求的浮点表示。
(注:ISO/IEC 60559标准中的浮点模型对b的幂求和是从0开始的,因此指数极值比这里显示的数值要少1。)
对于float类型和double类型,<float.h>头文件中对应的宏分别为:
| FLT_IS_IEC_60559 | 1 | |
| FLT_RADIX | 2 | |
| FLT_MANT_DIG | 24 | |
| FLT_EPSILON | 1.19209290E-07F | //十进制常量 |
| FLT_EPSILON | 0X1P-23F | //十六进制常量 |
| FLT_DECIMAL_DIG | 9 | |
| FLT_DIG | 6 | |
| FLT_MIN_EXP | -125 | |
| FLT_MIN | 1.17549435E-38F | //十进制常量 |
| FLT_MIN | 0X1P-126F | //十六进制常量 |
| FLT_TRUE_MIN | 1.40129846E-45F | //十进制常量 |
| FLT_TRUE_MIN | 0X1P-149F | //十六进制常量 |
| FLT_HAS_SUBNORM | 1 | |
| FLT_MIN_10_EXP | -37 | |
| FLT_MAX_EXP | +128 | |
| FLT_MAX | 3.40282347E+38F | //十进制常量 |
| FLT_MAX | 0X1.fffffeP127F | //十六进制常量 |
| FLT_MAX_10_EXP | +38 | |
| DBL_MANT_DIG | 53 | |
| DBL_IS_IEC_60559 | 1 | |
| DBL_EPSILON | 2.2204460492503131E-16 | //十进制常量 |
| DBL_EPSILON | 0X1P-52 | //十六进制常量 |
| DBL_DECIMAL_DIG | 17 | |
| DBL_DIG | 15 | |
| DBL_MIN_EXP | -1021 | |
| DBL_MIN | 2.2250738585072014E-308 | //十进制常量 |
| DBL_MIN | 0X1P-1022 | //十六进制常量 |
| DBL_TRUE_MIN | 4.9406564584124654E-324 | //十进制常量 |
| DBL_TRUE_MIN | 0X1P-1074 | //十六进制常量 |
| DBL_HAS_SUBNORM | 1 | |
| DBL_MIN_10_EXP | -307 | |
| DBL_MAX_EXP | +1024 | |
| DBL_MAX | 1.7976931348623157E+308 | //十进制常量 |
| DBL_MAX | 0X1.fffffffffffffP1023 | //十六进制常量 |
| DBL_MAX_10_EXP | +308 |
如果宏FLT_EVAL_METHOD值不为0,或者支持除ISO/IEC 60559默认模式外的编译舍入模式,十进制浮点常量可能无法提供正确值;但十六进制浮点常量在所有情况下都是正确的,因此它们的值可以精确表示。
主要参考资料: