C标准允许double与float属性一致 为何要求DBL_DECIMAL_DIG等≥10
首先要明确C标准中这两类浮点宏的约束是完全独立的,对应浮点类型的两个互不绑定的核心属性:
1. 两类宏的语义差异
DBL_MAX、DBL_MIN属于值域约束类宏,仅限制浮点类型可表示的正数值的上下边界,和类型能保存的精度没有直接关联。标准允许double和float的上下限一致,只是放开了值域的最低要求,没有降低对double的精度要求。DBL_DIG、DBL_DECIMAL_DIG属于精度约束类宏:DBL_DIG的含义是:可以被double类型无损往返转换的十进制数的最大位数,即你写一个n位十进制小数存入double,再转换回十进制时不会出现精度损失的最大n值。DBL_DECIMAL_DIG的含义是:所有double类型的二进制值,都可以被转换为至少n位十进制数,再转换回原二进制浮点值时不会发生变化的最小n值,是保证双向转换无歧义的精度指标。
2. 标准对浮点类型的层级定位要求
C标准对三种基础浮点类型有明确的层级约束,精度要求从低到高依次为float < double < long double,三类类型的定位差异是精度下限不同的核心原因:
float定位为低开销、低精度的浮点类型,所以精度最低要求是6位十进制有效数字,对应FLT_DIG >= 6、FLT_DECIMAL_DIG >= 6的约束。double定位为通用场景的高精度浮点类型,所以精度最低要求是10位十进制有效数字,对应更高的精度下限。
值域和精度本身没有绑定关系,完全可以实现一种double类型:值域和float完全一致(最大值1E+37、最小值1E-37),但尾数长度远大于float,精度远高于float,这种实现是完全符合标准要求的。
内容的提问来源于stack exchange,提问作者pmor
相关产品推荐
相关产品推荐

