对于T
为std::is_floating_point<T>::value
的类型true
,C ++标准是否指定了T
应该实现的方式?
例如,T
是否遵循符号/尾数/指数表示?或者它可以完全随意吗?
答案 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_infinity
,quiet_NaN
和more。
答案 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}'"'"')'
。这应该可以为您提供最佳和正确的代码。