Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;在浮点数的表示法上有什么规定吗? 代码>代码> t>代码> > STD::ISHOLATATION C++点:值 >代码>真/ ,C++标准是否指定了 T 的方式?_C++_C++11_Floating Point_Standards_Ieee 754 - Fatal编程技术网

C++;在浮点数的表示法上有什么规定吗? 代码>代码> t>代码> > STD::ISHOLATATION C++点:值 >代码>真/ ,C++标准是否指定了 T 的方式?

C++;在浮点数的表示法上有什么规定吗? 代码>代码> t>代码> > STD::ISHOLATATION C++点:值 >代码>真/ ,C++标准是否指定了 T 的方式?,c++,c++11,floating-point,standards,ieee-754,C++,C++11,Floating Point,Standards,Ieee 754,例如,T是否必须遵循符号/尾数/指数表示?或者它是完全任意的吗?来自N3337: [basic.basical/8]:有三种浮点类型:浮点型、双精度型和长双精度型。类型double至少提供 精度与float相同,longdouble类型提供的精度至少与double相同。 float类型的值集是double类型的值集的子集;值集 double类型的值是long double类型的值集的子集的值表示形式 浮点类型由实现定义。整型和浮点型统称为算术型 类型。标准模板std::numeric_limit

例如,
T
是否必须遵循符号/尾数/指数表示?或者它是完全任意的吗?

来自N3337:

[basic.basical/8]:
有三种浮点类型:浮点型、双精度型和长双精度型。类型double至少提供 精度与float相同,longdouble类型提供的精度至少与double相同。 float类型的值集是double类型的值集的子集;值集 double类型的值是long double类型的值集的子集的值表示形式 浮点类型由实现定义。整型和浮点型统称为算术型 类型。标准模板std::numeric_limits(18.3)的专门化应规定最大值 以及实现的每种算术类型的最小值

如果要检查您的实现是否使用IEEE-754,可以使用:

static\u assert(标准::数字\u限制::is\u iec559,
“本规范要求IEEE-754双精度”);

在这一领域还有许多其他的助手特征,例如,和。

std::is_floating_point的思想是让不同来源的用户代码更好地协同工作。从技术上讲,您可以将
int
指定为
std::is\u floating\u point
,而不会导致未定义的行为。但是假设您有一些模板库,它必须反复除以
tn
。为了加快速度,库创建了一个
tni=1/n
,并用
n
代替除法,用
ni
代替乘法。这对浮点数很有效,但对整数无效。因此,只有当
std::is\u floating\u point::value==true
时,库才能正确地进行优化。如果你撒谎,从标准的角度来看,代码可能仍然有效,但从逻辑的角度来看是不正确的。因此,如果您编写的类的行为类似于一个更大的
float
,请将其标记为
std::is\u floating\u point
,否则不要这样做。这将使您获得最佳和正确的代码。

不需要特定的实现。C++标准根本就不谈论它。C标准对浮点数的概念模型进行了相当详细的介绍,在一些基础
b
中有符号、指数、有效位等。然而,它特别指出,这纯粹是描述性的,不是实施的要求(C11,脚注21):

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

这就是说,尽管细节可能会有所不同,但至少在我看来,(例如)生成(例如)与常规模型(即有效位和指数)不太匹配的
double
一致性实现是困难的(或者至少在竞争性性能方面是困难的)。不过,让它在其他方面有所不同并不特别困难,比如重新安排订单,或者使用不同的基础

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

C标准有一个“附录”(在C11中是附录F),其中规定了C实现符合IEC 60559的含义,IEEE 754的后续标准。符合附录F的实现必须具有IEEE表示浮点数。但是,实施本附件是可选的;核心标准特别避免提及浮点数的表示


我不知道C++是否有一个等价的附件。它没有出现在N3337中,但这可能只是意味着它是单独分发的。<代码> STD::Nig.IdCix:I/CODE>指出C++委员会至少考虑过这个问题,但可能没有C委员会那样详细。(一直是,而且一直是一个该死的耻辱,C++标准不表达为一套编辑到C标准。)/P>你的报价并没有真正回答这个问题。该问题询问是否对允许的浮点格式有限制。您的回答表明,浮点格式必须由实现者记录。它是相关的,但实际上并不相同。@hvd:That(实现者必须提供文档)是唯一的限制,除了数学库必须实现的所需范围和操作之外。@hvd我不确定我是否理解。回答中一个简单的“这是唯一的限制”对你来说足够吗?@TartanLlama如果它真的是唯一的限制,那么它就可以了,但它不是。
std::numeric_limits
的成员的定义方式略微限制了
double
的可能表示形式。(对于所有其他浮点类型,同样如此))要求调用<代码>外部“C”<代码>函数,使用一个指向C++的代码>双< /代码>进一步限制C.允许的表示为零,不需要全部为零,我想<代码>数字限制::数字< /代码>
static_assert(std::numeric_limits<double>::is_iec559,
              "This code requires IEEE-754 doubles");