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

Vin*_*ent 11 c c++ floating-point standards c++11

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

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

das*_*ght 8

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

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

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


Die*_*ühl 5

以下是有关工作的一些简单原因,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位格式没有:有一个提议而不是另一个提议者(我)没有兴趣为两者写提案.