TR2 W.R.T. 的状态和内容C++ 规范
Posted
技术标签:
【中文标题】TR2 W.R.T. 的状态和内容C++ 规范【英文标题】:Status & Contents of TR2 W.R.T. C++ Specification 【发布时间】:2011-01-13 18:11:53 【问题描述】:参考链接:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2849.pdf
我正在尝试收集有关 TR2 的信息以及它与即将推出的 C++ 标准的关系(如果有的话)。
到目前为止,这是我的问题。如果我错过了任何重要的问题,请也回答这些问题。 :)
预赛:
-
当前的 C++ 标准对浮点值的精确二进制表示保持沉默。它只是说浮点表示是“实现定义的”。实际上,我知道的每个实现都使用IEEE 754-2008。但这不是标准的要求。
TR2 标识要添加到语言中的新类型:
decimal32
、decimal64
和 decimal128
。
问题/评论点:
-
上面的新类型(
decimal64
等)是语言原生的,还是在库中提供?
新类型是否可以解决浮点不精确的问题?如果有,怎么做?
TR2 是否要求这些(或任何)类型使用特定的二进制表示?
TR2 是否会被接受为即将到来的 C++ 标准的一部分?如果有,什么时候?
这些新类型的实现是否在任何当前可用的库(例如 Boost)中可用?
【问题讨论】:
语言中添加了本地类型?这些不是库提供的类(并且在tr2
命名空间中启动)吗?
@Ben:编辑问题以将您的评论作为未知数(对我而言)
+1 用于标记 c++0x,而不是 c++1x。
@downvoters:如果您认为这个问题有问题,请告诉我。如果有不足之处,我很乐意对其进行编辑。
有趣的是,已经有另外三个问题被标记为tr2
,但从我一眼看,这些都是错误标记的。
【参考方案1】:
仅供参考,链接的文档不是 TR2。 “TR2”指的是一组库扩展,与 TR1 风格相同,而“十进制浮点算术扩展”的草案就是这样。目前还没有TR2草稿,原计划0x之后出。所以从这里开始,我假设你不是在问 TR2,而是在问链接的文档。
-
库: 但是,草案在
std::decimal
下定义了新类,可以轻松包装平台/实现提供的本机类型。此 TR 未定义十进制文字。
是: “避免转换错误的最有效方法是使用十进制算术。认识到这一点,IEEE 754-2008 浮点算术标准指定了十进制浮点编码和算术。这份技术报告指定对 C++ 编程语言国际标准的扩展,以允许以符合 IEEE 754-2008 标准的方式使用十进制算术。”
是: IEEE 754-2008中定义的三种十进制编码格式对应三种十进制浮点类型std::decimal::decimal32
、64和128。参考表here.中的decimalN
链接
在当前的 C++0x 草案中没有这些提议的迹象。也许在下一个标准中,但即使是委员会成员也无法告诉你什么时候会出来。
当我进行快速网络搜索时,我没有看到任何十进制库提到此特定草稿,但如果您只需要一个库,这里有一些。
【讨论】:
【参考方案2】:我碰巧参加了 IBM 最初向 WG14 和 WG21 提出十进制类型的会议。他们最初的提议是将它们作为本机类型提供,这几乎是 C 中唯一的解决方案。然而,WG21 并不完全相信,并指出 C++ 已经在库中将 std::complex<>
作为数学类型,所以为什么不呢? std::decimal<>
?当指出std::decimal
显然可以包装_Decimal
编译器扩展时,关于性能开销的最初困惑很快就结束了。
指出这可以在库中完成后,下一个问题是这是否应该在标准库中。毕竟这是一个有用的专业领域。最常见的领域,金融,实际上并不需要它(他们真的需要十进制定点,而不是十进制浮点)。在收到此反馈后,IBM 并没有进一步推动他们的提议。
这些类型不能解决浮点不准确的问题。 1/3 仍然无法表示。但是,1/5 是。
【讨论】:
有限十进制/二进制表示的 1/3 不是问题,而不是浮点数?定点数也有同样的限制。 @Steve:我也是这么想的。尝试在不使用横线的情况下以十进制形式在纸上写下值 1/3 时会遇到同样的问题。 我猜浮点精度的“问题”是无法准确表示任何可以仅使用数字、小数和负号写下的有理数。 嗯,十进制浮点数可以表示 1/5,而二进制浮点数不能。而在三进制浮点中,1/3 显然只是0.1
。因此,所有这些浮点格式的真正问题是它们都必须选择一个基数,而无论您选择什么基数,其他基数中的分数都是有问题的。巴比伦人在使用 60 分和秒时实际上有一个好处;)【参考方案3】:
decNumber++ 是 IBM 的参考实现。
【讨论】:
以上是关于TR2 W.R.T. 的状态和内容C++ 规范的主要内容,如果未能解决你的问题,请参考以下文章