对于类型T
为其中std::is_floating_point
的true
,不C++标准规定上的任何方式T
应实施?
例如,是否T
甚至遵循符号/尾数/指数表示?或者它可以是完全随意的?
从N3337:
[basic.fundamental/8]:
有三种浮点类型:float,double和long double.double类型提供至少与float一样多的精度,long double类型提供至少与double一样多的精度.float类型的值集是double类型的值集的子集; double类型的值集是long double类型的值集的子集.浮点类型的值表示是实现定义的.积分和浮动类型统称为算术类型.标准模板std :: numeric_limits(18.3)的特化应指定实现的每种算术类型的最大值和最小值.
如果要检查您的实现是否使用IEEE-754,您可以使用std::numeric_limits::is_iec559
:
static_assert(std::numeric_limits::is_iec559, "This code requires IEEE-754 doubles");
有许多在这一领域的其他辅助性的特征,比如has_infinity
,quiet_NaN
和更多.
C标准有一个"附件"(在C11中是附件F),它阐明了C的实现对于符合IEC 60559(IEEE 754的后续标准)的意义.符合附件F的实现必须具有IEEE - 表示浮点数.但是,实施本附件是可选的; 核心标准特别避免说出浮点数的表示.
我不知道C++是否有相应的附件.它没有出现在N3337中,但这可能仅仅意味着它是单独分发的.存在std::numeric_limits
表明C++委员会至少考虑过这个问题,但可能没有C委员会那么详细.(C++标准并未表示为对C标准的一组编辑,这一直是一个耻辱.)
无需特别实施.C++标准根本没有谈论它.C标准详细介绍了浮点数假设的概念模型,在某个基数中有符号,指数,有效数,b
等等.但是,它明确指出这纯粹是描述性的,而不是对实施的要求(C11,脚注21):
浮点模型旨在阐明每个浮点特性的描述,并且不要求实现的浮点算法相同.
也就是说,虽然细节可能会有所不同,但至少在我看来,产生(例如)一致的实现double
并不能与通常的模型(即有效数和指数)非常接近将是困难的(或者至少很难与竞争表现有关,无论如何).然而,以其他方式改变它并不是特别困难,例如重新排列顺序或使用不同的基础.
std::numeric_limits
(和std::numeric_limits
)的定义相当直接地表明,作为浮点类型列出的内容必须在相当宽的范围内保持(至少近似)所有数字的相同精度.到目前为止,实现这一目标最明显的方法是将一些位/数字专用于有效数字,以及一些其他(单独的)位专用于指数.