每种类型都支持小数位数的宏。gcc 文档解释了它们是什么以及它们的含义:
FLT_DIG
这是浮点数据类型的精度的十进制位数。从技术上讲,如果 p 和 b 分别是表示形式的精度和基数,则小数精度 q 是小数位数的最大数量,这样任何以 q 为基数 10 位的浮点数都可以四舍五入为浮点数: p 以 b 为基数,然后返回,不更改 q 十进制数字。
该宏的值应该至少为 6,以满足 ISO C.
DBL_DIG
LDBL_DIG它们与 FLT_DIG 类似,但分别针对数据类型 double 和 long double。这些宏的值应该至少为 10。
在 gcc 4.9.2 和 clang 3.5.0 上,这些宏分别生成 6 和 15。
如果您使用的是使用IEEE-754浮点算术的体系结构(与大多数体系结构一样),则该类型float对应于单精度,而该类型double对应于双精度,如标准中所述。
让我们做一些数字:
32位代表数字,其中24位代表尾数。这意味着最低有效位(LSB)相对于MSB 的相对值为2 ^(-24),即“隐藏1”,因此未显示。因此,对于固定的指数,最小可表示值是指数的10 ^(-7.22)倍。这意味着对于基本指数表示法(3.141592653589 E 25)而言,只有“ 7.22”十进制数有效,这实际上意味着至少7个十进制始终正确。
64位代表数字,其中53位代表尾数。按照相同的推理,将2 ^(-53)表示为10的幂将得到10 ^(-15.95),这意味着至少15个小数将始终是正确的。