C++ 如何约束非IEEE754浮点类型的大小?
非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类型的值集是
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节中定义了许多其他信息,但没有任何内容以您要求的方式限制浮点值
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,这可能更接近要求的标记,是的。