问题 为什么decimal128可能是标准化的,而四精度不会?


这是一个非常天真的问题。如果我们查看C和C ++标准委员会,他们目前正致力于添加十进制浮点标准类型:

所以看来我们可能会有一个标准化的 decimal128 类型,而我们还没有任何标准化 binary128 类型(四精度而不是简单的扩展双精度)。这种情况有技术原因还是纯粹的“政治”?


5369
2017-12-20 10:33


起源

isocpp.org 链接到讨论区域(我认为论坛和邮件列表),您可以找到答案,或者询问。推测将会和不会成为标准的内容需要一个水晶球。效率不高。 - Mat
groups.google.com/a/isocpp.org/forum/#!forum/std-proposals - inf
您测量十进制浮点数的兴趣的方法令人难以置信,因此您的问题基于错误的前提。你找不到关于二进制四精度(binary128)的文档的一个原因是编译器已经可以自由地将binary128映射到 long double而且由于这可以在不破坏程序员期望的情况下完成,因此一些编译器已经做到了。 (C标准还允许将十进制浮点映射到任何一个 float, double,...但另一方面,如果不打破程序员的期望,这是不可能完成的) - Pascal Cuoq
浮点计算通常被假定为硬件加速。但目前的处理器都不支持binary128,因此需求量很小。当然decimal128也没有加速,即使它很慢,它仍然不是15年后主流的核心原因仍然有用。 - Hans Passant
@ gnasher729在PowerPC ABI中, long double 是128位长,但这不是IEEE binary128(a.k.a。四倍精度)。这是一个双重算术。看到 long double 在维基百科上 详情。 - vinc17


答案:


四精度二进制浮点不能替代十进制类型。精度问题是次要数字表示的次要问题。我们的想法是为语言添加一种类型,以支持数字的表示 0.1 没有任何精度损失 - 无论二进制浮点类型的精度有多高,都无法做到这一点。

这就是为什么添加十进制类型的讨论与添加四精度数据类型的讨论是正交的:这两种类型用于不同的目的,如您链接的一个提案中所讨论的:

人类计算和数值通信几乎总是使用小数   算术和十进制表示法。实验室笔记,科学论文,法律文件,业务   报表和财务报表均以十进制形式记录数值。当数字数据是   给予程序或向用户显示,需要二进制到十进制转换。   这种转换涉及固有的舍入错误;小数部分不能,在   通常,由二进制浮点值精确表示。这些错误通常会导致可用性   和效率问题,取决于应用程序。


8
2017-12-20 10:43





以下是有关工作原因的一些简单原因 decimal128 而不是128位的二进制浮点数:

  1. IEEE 754(2008)定义了三种基本的十进制浮点格式(32,64和128位)。在添加支持时标准化所有三个接口似乎是合理的,特别是因为没有太大差异(好吧,32位版本没有指定算术)。使用IEEE 754(2008)语义将需要十进制浮点支持。
  2. 当前定义的浮点格式[仍然]不需要遵循IEEE 754语义,甚至不定义基数(存在使用基数2和基数16的实现)。对于不使用IEEE的平台,不清楚如何扩展格式。在使用IEEE 754的情况下,它基于IEEE 754(1984),其仅定义了两种基本格式,并且没有强制要求第三种格式的提议。
  3. 目前的定义 long double 任何供应商似乎不太可能接受改变其当前含义以使用IEEE 754(2008)128位语义:它会改变大致所有实现的行为。我希望有人反对强制使用IEEE 754 floatdouble,即任何IEEE 754对二进制浮点的支持都是某些人需要提出的全新内容。我希望这样的提议有点争议,例如,关于使用什么名称以及是否实际添加128位支持,因为大多数用户会期望它获得硬件支持并且在硬件上工作的人似乎有其他优先级。请注意,没有人期望(或者应该期望)对十进制浮点的硬件支持:虽然Power7和后来的处理器上有硬件支持,但没有其他供应商在考虑这个想法。
  4. 我对使用二进制128位浮点值没有兴趣,使用或经验。另一方面,我感兴趣并且使用十进制浮点数(我的经验有点受限但它肯定比使用二进制128位浮点数更大)。我的主要用途是使用十进制值更容易正确计算:是的,我意识到了这一点  可以正确使用二进制浮点和/或整数,但在实践中几乎没有人能正确地进行这些计算,并且进行正确的数学运算几乎是微不足道的。鉴于添加128位二进制浮点需要非常重要的工作,并可能危及联合提案,我不打算添加它们。当然,这并不意味着其他人无法完成这项工作。
  5. 尽管二进制浮点可以是精确的,但它们主要用于快速计算并且接受舍入。丢失几位似乎是可以接受的。我意识到一些应用程序将受益于更大范围的值,但该参数将产生无限的位支持。对于十进制浮点,这种推理是不同的:使用它们的唯一原因是精确算术,实际上是通常使用的相当有限的一组操作。不那么快的计算比不正确的结果更容易接受。虽然16位数对于大多数用途来说已经足够了,但实际上已经有一些用途略微超过16位或非常接近。一世 猜测 这个推理使得在IEEE 754上工作的人在最初添加十进制浮点时包含128位十进制浮点,而当二进制浮点最初标准化时,没有使用类似的推理。

tl; dr:没有任何关于十进制128位格式正在处理的政治和二进制128位格式没有:有一个提议而不是另一个提议者(我)没有兴趣为两者写提案。


5
2017-12-20 22:35



我想知道112 + 16位二进制浮点类型的实际有用性如何与a的实际有用性相比较 适当支持 80位型?许多没有FPU加速的处理器可以使用80位类型 更多 效率高于64位类型,80位类型能够保存任何其他数字原语,包括64位 long。我看到的超越64位尾数的唯一优势是舍入执行一个的结果 double 操作到中间类型然后舍入到 double 将避免1 / 2048ulp的舍入错误。 - supercat


在ISO C中有一些支持IEEE 754-2008的工作,这意味着binary128(和更多)可能是标准化的。看到 ISO / IEC JTC 1 / SC 22 / WG 14 N1789。那么C ++应该遵循。

现在,尽管有时会实现binary128,但我怀疑它会在一段时间之前在实践中使用,因为当前的实现完全是在软件中(尽管可能会改变),并且有更快,更灵活的方法来获得更准确的结果: 双重算术 或类似的想法(例如浮点扩展,这或多或少是双重算术的推广)。


3
2017-12-21 01:08