当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《C++标准是否指定浮点数表示的任何内容?》经验,为你挑选了3个好方法。

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

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



1> TartanLlama..:

从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和更多.


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

2> zwol..:

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

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



3> Jerry Coffin..:

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

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

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

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

推荐阅读
个性2402852463
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有