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

时间:2015-12-15 16:51:44

标签: c++ c++11 floating-point standards ieee-754

对于Tstd::is_floating_point<T>::value的类型true,C ++标准是否指定了T应该实现的方式?

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

4 个答案:

答案 0 :(得分:37)

来自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");

此区域还有许多其他辅助特征,例如has_infinityquiet_NaNmore

答案 1 :(得分:10)

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

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

答案 2 :(得分:7)

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

  

浮点模型旨在阐明每个浮点特征的描述   不要求实现的浮点运算是相同的。

尽管如此,虽然细节可能会有所不同,但至少在我看来,产生(例如)double的符合要求的实施方式相当与通常的模型(即有效数和指数)将是困难的(或者至少难以与竞争性表现相关)。然而,以其他方式改变它并不是特别困难,例如重新排列顺序或使用不同的基础。

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

答案 3 :(得分:3)

std::is_floating_point的想法是让不同来源的用户代码更好地协同工作。从技术上讲,您可以将int指定为std::is_floating_point,而不会导致未定义的行为。但是你说有一些模板库需要反复划分T n。为了加快速度,图书馆会创建一个T ni = 1 / n,并按n乘以ni替换除法。这适用于浮点数,但对于整数则失败。因此,只有std::is_floating_point<T>::value == true才能正确地进行优化。如果你撒谎,代码可能仍然从标准的角度来看,但从逻辑的角度来看是不正确的。因此,如果您编写的行为类似于较大的float,则将其标记为std::is_floating_point,否则请将其标记为PS1='$(code | awk '\''{print $1}'\'')' # or PS1='$(code | awk '"'"'{print $1}'"'"')' 。这应该可以为您提供最佳和正确的代码。