非IEEE754浮点类型float
,double
和long double
的大小是如何约束的?
我知道每个浮点类型必须能够表示较小类型的所有值,这意味着sizeof(float) <= sizeof(double) <= sizeof(long double)
。
据我所知,float.h
/ cfloat
最低要求需要sizeof(float)*CHAR_BIT>=32
,sizeof(double)*CHAR_BIT>=64
和sizeof(long double)*CHAR_BIT>=64
。
还有其他限制吗?如果是这样,它们是什么,并且在这些尺寸上是否意味着最大值?
答案 0 :(得分:3)
我认为问题是关于可表示值的约束。只有相当基本的约束条件没有在C ++中明确说明,但在第5.2.4.2.2节(“浮动类型的特征<float.h>
”)中的C标准中有详细说明,第11段(我只是在这个上下文中引用我认为有趣的值:
以下列表中给出的值应由具有实现定义值的常量表达式替换,这些值的大小(绝对值)大于或等于显示的值,具有相同的符号:
FLT_DECIMAL_DIG 6
DBL_DECIMAL_DIG 10
LDBL_DECIMAL_DIG 10
FLT_MIN_10_EXP -37
DBL_MIN_10_EXP -37
LDBL_MIN_10_EXP -37
FLT_MAX_10_EXP +37
DBL_MAX_10_EXP +37
LDBL_MAX_10_EXP +37
FLT_MAX 1E+37
DBL_MAX 1E+37
LDBL_MAX 1E+37
FLT_EPSILON 1E-5
DBL_EPSILON 1E-9
LDBL_EPSILON 1E-9
这几乎说明float
可能小于double
而double
和long double
可能是同一个事情,并且它们相当遥远符合IEEE-754的限制。
答案 1 :(得分:2)
来自N3337:
3.9.1.8
有三种浮点类型:float
,double
和long double
。类型double
提供的精度至少与float
一样,类型long double
提供的精度至少与double
一样。类型float
的值集是类型double
的值集的子集;类型double
的值集是类型long double
的值集的子集。浮点类型的值表示是实现定义的。积分和浮动类型统称为算术类型。标准模板std::numeric_limits
(18.3)的特化应指定实现的每种算术类型的最大值和最小值。
C标准在这里也是相关的,所以这里(N1570)对浮点类型有什么看法:
6.2.5.10
有三种实际浮动类型,指定为float
,double
和long double
。42)类型float
的值集是值集的子集的 输入double
;类型double
的值集是long double
类型值集的子集。42)参见“未来语言方向”(6.11.1)。
6.11.1.1浮动类型
未来的标准化可能包括其他浮点类型,包括那些 比long double
更大的范围,精度或两者。
据我所知,浮点几乎都是实现定义的。有充分理由,浮点由CPU实现。标准不能保证各种浮点类型的大小。如果是这样,它可能会变得与新的处理器完全不兼容。
float.h和cfloat标头正在标准中使用它们来定义实现。您提供的尺寸不是标准的一部分。
所以不,没有其他限制。*不,没有隐含的最大尺寸。