2009-11-29 44 views
2

据我知道浮点值的形式为N * 2^E的,与C++标准在哪里定义浮点类型的值范围?

  • 浮动范围为N = - (2^23-1) - (2^23-1),和E = -126 - 127,
  • 双范围为N = - (2^52-1) - (2^52-1),和e = -1022 - 1023

我一直在寻找通过C++标准,但未能找到标准指定的地方,或者强制将float,double和long double类型与其他(IEEE)标准中定义的范围相关联。我在3.9.1.8中发现的唯一相关事物是:

有三种浮点类型:float,double和long double。 double类型至少提供与float相同的精度,long double类型的精度至少与double相当。 float类型的值的集合是类型double的值集合的子集;类型double的值集合是long double类型的值集合的子集。浮点类型的值表示是实现定义的。

而且没有提及该类型提供的最小范围。

标准在哪里/如何指定浮点类型的(最小?)值范围?或者编译器能够自由选择任何值范围,并且仍然符合标准?

+0

https://docs.microsoft.com/en-us/cpp/c-language/type-float https://docs.microsoft.com/en-us/cpp/c-language/type-double – Andrew 2017-07-08 00:12:40

回答

1

就像整数数字限制一样,从C标准导入float,doublelong double的限制。常数FLT_MAX,​​和LDBL_MAX的最小值为1E+37。对于其*_MIN变体,最大值为1E-37

+0

谢谢,正是我所期待的。 C标准确实对浮动范围有一定的最低要求。例如,浮动应该能够按照您所说的持有1E-37和1E37,并且1与下一个较大的可浮动浮动之间的差值应该是1E-5或更小。 – shojtsy 2009-11-29 22:21:23

6

你引用的是关于C++中浮点类型的所有保证。正如它所说的,它们的表示是实现定义的。

尽管如此,您仍然可以使用<limits>中的std::numeric_limits模板来查询有关限制的信息以及这些类型是否为IEC 559(IEEE 754)指定类型。

2

该标准没有指定这样的东西,因为它们通常依赖于硬件并随时间而变化。虽然今天32位被认为是一个标准,但在10年内处理小于64位的内容可能看起来不合常理。

+0

浮点数的大小由IEEE定义,你的编译器可能会选择它自己的非标准浮点数defn,但它会告诉你。 – 2009-11-29 20:10:59

+1

我不确定我是否同意32位将变得“令人厌恶”的前提,即使是现在,8位处理器也在嵌入式领域看到了实质性的应用。 32位可能会长时间保持在手机设备的主流 – SingleNegationElimination 2009-11-29 20:48:21