C++ 如何约束非IEEE754浮点类型的大小?

C++ 如何约束非IEEE754浮点类型的大小?,c++,c,floating-point,ieee-754,C++,C,Floating Point,Ieee 754,非IEEE754浮点类型的大小如何约束 我知道每个浮点类型必须能够表示较小类型的所有值,这意味着sizeof(float)=64,以及sizeof(long double)*CHAR\u BIT>=64 还有其他限制吗?如果是,它们是什么?它们是否暗示这些尺寸的最大值?来自N3337: 3.9.1.8 有三种浮点类型:float、double和long double。类型double提供的精度至少与float相同,类型long double提供的精度至少与double相同。float类型的值集是

非IEEE754浮点类型的大小如何约束

我知道每个浮点类型必须能够表示较小类型的所有值,这意味着
sizeof(float)=64
,以及
sizeof(long double)*CHAR\u BIT>=64

还有其他限制吗?如果是,它们是什么?它们是否暗示这些尺寸的最大值?

来自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
有三种实浮点类型,分别指定为
浮点
双浮点
、和
长浮点
double
.42)类型
float
的值集是 键入
double
double
类型的值集是
long double
类型的值集的子集

42)见“未来语言说明”(6.11.1)

6.11.1.1浮动类型
未来的标准化可能包括其他浮点类型,包括 距离、精度或两者都大于长双精度

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

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

因此,没有其他限制。*也没有,没有隐含的最大尺寸

  • 这完全不是真的。N1570第5.2.4.2.2节中定义了许多其他信息,但没有任何内容以您要求的方式限制浮点值
我认为问题是关于可表示值的约束。只有一些基本的约束在C++中没有明确地阐明,但是在5.2.4.2.2节(“浮动类型的特性<代码> <代码> >”中的C标准中被阐明了,第11段(我只是引用了我认为在这方面有趣的值):

下表中给出的值应替换为常量表达式,其值的大小(绝对值)应大于或等于所示值,且符号相同:

  • FLT\u DECIMAL\u DIG 6
  • DBL\u十进制\u DIG 10
  • LDBL\u DECIMAL\u DIG 10
  • FLT\u MIN\u 10\u EXP-37
  • DBL\u MIN\u 10\u EXP-37
  • LDBL\u MIN\u 10\u EXP-37
  • FLT\u MAX\u 10\u EXP+37
  • DBL\u MAX\u 10\u EXP+37
  • LDBL\u MAX\u 10\u EXP+37
  • FLT_最大1E+37
  • DBL_最大1E+37
  • LDBL_最大1E+37
  • FLT_EPSILON 1E-5
  • DBL_ε1E-9
  • LDBL_EPSILON 1E-9

这相当于说,
float
很可能比
double
小,
double
long double
可以是同一件事,而且它们与IEEE-754的约束条件相比可能相去甚远。

取决于您所说的任何浮点格式的定义。我知道的那些这是因为就像IEEE754一样,每个字符的大小都是固定的,因此不能在其中放入比可用的更多的位。问题是什么?
char
不要求为8位,所以它们的大小都可以为1。在64位DSP上,这实际上是合理的。我可以轻松地制作
sizeof(float)>sizeof(double)
--只是在
浮点值中浪费空间
@HansPassant:啊,但是拥有一个标准的全部乐趣在于,我们不必想象IEEE-754实际会有什么奇怪的实现。我们只是相信委员会,允许它是一个好主意(或者不同意委员会的意见,编写不可严格移植的代码,ofc)。我给出的大小可能是
cfloat
要求的最低要求的结果,例如FLT_DIG、FLT_MIN_10_EXP、FLT_MAX_10_EXP和FLT_EPSILON。如果是,那么这只是一个副作用,而不是实现要求。例如,浮点上的FLT_DIG是6,这要求浮点可以处理高达1e的值这意味着一个浮点数至少能够处理23.253…位的精度。+1,这可能更接近要求的标记,是的。