非IEEE 754浮点类型的大小如何受到限制?

时间:2013-11-24 21:03:31

标签: c++ c floating-point ieee-754

非IEEE754浮点类型floatdoublelong double的大小是如何约束的?

我知道每个浮点类型必须能够表示较小类型的所有值,这意味着sizeof(float) <= sizeof(double) <= sizeof(long double)

据我所知,float.h / cfloat最低要求需要sizeof(float)*CHAR_BIT>=32sizeof(double)*CHAR_BIT>=64sizeof(long double)*CHAR_BIT>=64

还有其他限制吗?如果是这样,它们是什么,并且在这些尺寸上是否意味着最大值?

2 个答案:

答案 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可能小于doubledoublelong double可能是同一个事情,并且它们相当遥远符合IEEE-754的限制。

答案 1 :(得分:2)

来自N3337:

  

3.9.1.8
  有三种浮点类型:floatdoublelong double。类型double提供的精度至少与float一样,类型long double提供的精度至少与double一样。类型float的值集是类型double的值集的子集;类型double的值集是类型long double的值集的子集。浮点类型的值表示是实现定义的。积分和浮动类型统称为算术类型。标准模板std::numeric_limits(18.3)的特化应指定实现的每种算术类型的最大值和最小值。

C标准在这里也是相关的,所以这里(N1570)对浮点类型有什么看法:

  

6.2.5.10
  有三种实际浮动类型,指定为floatdoublelong double。42)类型float的值集是值集的子集的   输入double;类型double的值集是long double类型值集的子集。

     

42)参见“未来语言方向”(6.11.1)。

     

6.11.1.1浮动类型
  未来的标准化可能包括其他浮点类型,包括那些   比long double更大的范围,精度或两者。

据我所知,浮点几乎都是实现定义的。有充分理由,浮点由CPU实现。标准不能保证各种浮点类型的大小。如果是这样,它可能会变得与新的处理器完全不兼容。

float.h和cfloat标头正在标准中使用它们来定义实现。您提供的尺寸不是标准的一部分。

所以不,没有其他限制。*不,没有隐含的最大尺寸。

  • 这并非严格属实。 N1570第5.2.4.2.2节中定义了许多其他信息,但没有任何限制以您要求的方式限制浮点值。