C++标准是否指定浮点数表示的任何内容?

Vin*_*ent 36 c++ floating-point standards ieee-754 c++11

对于类型T为其中std::is_floating_point<T>::valuetrue,不C++标准规定上的任何方式T应实施?

例如,是否T甚至遵循符号/尾数/指数表示?或者它可以是完全随意的?

Tar*_*ama 38

从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<double>::is_iec559,
              "This code requires IEEE-754 doubles");
Run Code Online (Sandbox Code Playgroud)

有许多在这一领域的其他辅助性的特征,比如has_infinity,quiet_NaN更多.

  • @hvd:那个(实现者必须提供文档)是唯一的限制,除了数学库必须实现的必需范围和操作. (6认同)
  • @TartanLlama如果它实际上是唯一的限制,那就没关系,但事实并非如此.`std :: numeric_limits <double>`的成员以稍微限制`double`的可能表示的方式定义.(对于所有其他浮点类型也是如此.)能够调用`extern"C"`函数以获取指向C++`double`的指令的要求进一步限制了可能的表示形式. (2认同)

zwo*_*wol 11

C标准有一个"附件"(在C11中是附件F),它阐明了C的实现对于符合IEC 60559(IEEE 754的后续标准)的意义.符合附件F的实现必须具有IEEE - 表示浮点数.但是,实施本附件是可选的; 核心标准特别避免说出浮点数的表示.

我不知道C++是否有相应的附件.它没有出现在N3337中,但这可能仅仅意味着它是单独分发的.存在std::numeric_limits<floating-type>::is_iec559表明C++委员会至少考虑过这个问题,但可能没有C委员会那么详细.(C++标准并未表示为对C标准的一组编辑,这一直是一个耻辱.)


Jer*_*fin 7

无需特别实施.C++标准根本没有谈论它.C标准详细介绍了浮点数假设的概念模型,在某个基数中有符号,指数,有效数,b等等.但是,它明确指出这纯粹是描述性的,而不是对实施的要求(C11,脚注21):

浮点模型旨在阐明每个浮点特性的描述,并且不要求实现的浮点算法相同.

也就是说,虽然细节可能会有所不同,但至少在我看来,产生(例如)一致的实现double并不能与通常的模型(即有效数和指数)非常接近将是困难的(或者至少很难与竞争表现有关,无论如何).然而,以其他方式改变它并不是特别困难,例如重新排列顺序或使用不同的基础.

std::numeric_limits<T>::digits(和std::numeric_limits<T>::digits10)的定义相当直接地表明,作为浮点类型列出的内容必须在相当宽的范围内保持(至少近似)所有数字的相同精度.到目前为止,实现这一目标最明显的方法是将一些位/数字专用于有效数字,以及一些其他(单独的)位专用于指数.