浮点数据类型的最小范围是 1E-37 到 1E+37。浮动的最大范围是多少?
4 回答
至于最大浮点类型的最大值,标准没有规定。标准指定的是“最大值中的最小值”。
C11 §5.2.4.2.2浮动类型的特征
<float.h>
第 12 和 13 节以下列表中给出的值应替换为具有大于或等于所示值的实现定义值的常量表达式: — 最大可表示的有限浮点数,(1 − b−p)bemax
FLT_MAX 1E+37
DBL_MAX 1E+37
LDBL_MAX 1E+37
FLT_MIN 1E-37
DBL_MIN 1E-37
LDBL_MIN 1E-37
最大范围以及所有重要的实际实现的范围-INFINITY
是+INFINITY
. 实际上,“可表示值的范围:forfloat
包括无穷大”(在支持无穷大的实现上)实际上起作用的地方是,常量表达式超出其类型的值范围是违反约束的,但即使类似的东西1e9999999999999999999999999999
在 IEEE 单精度浮点值的范围内,因为范围是-INFINITY
to +INFINITY
。有一个缺陷报告/解释在某处详细说明了这个问题,但我没有方便的链接。
没有一般的最大范围。C 标准仅指定必须至少覆盖哪个范围。编译器可以支持任何更大的范围。
但是,有一个浮点类型标准IEEE 754,详细说明了浮点平台的行为。该标准通常适用。
根据该标准,值为 1.4E-45 和 3.4E38。
没有最大范围。允许任意慷慨的实现。对浮点实现的唯一限制是:
的可能值集合是 的可能值
float
集合的子集double
;的可能值集合是 的可能值
double
集合的子集long double
;float
(因此double
和)的所有可能值的集合long double
必须包括至少一个 ≥ 1E37 的有限数和一个≤ -1E37 的有限数;float
(因此double
和)的所有可能值的集合long double
必须包括至少一个不为零的正数 ≤ 1E-37;的所有可能值的集合
float
必须至少包含一个大于 1.0 的正数 ≤ 1.0 + 1.0E-5;而double
(and 因此long double
) 的所有可能值的集合必须包含至少一个大于 1.0 的正数 ≤ 1.0 + 1.0E-9。
最后一个要求并不严格要求double
比float
因为float
也可以包括相同的值更精确。
但是,实现可以定义宏__STDC_IEC_559__
。如果是,它需要承诺实施 IEC-60559 标准(实际上是 IEEE-754);这一承诺包括要求float
精确为 IEC-60559 单精度(32 位)格式,以及double
精确为 IEC-60559 双精度(64 位)格式。long double
不需要是 IEC-60559 格式,但它必须是double
(或完全相同的类型)的超集,如上所示。