C++ 为什么小数128可能会标准化,而四位精度不会标准化?

C++ 为什么小数128可能会标准化,而四位精度不会标准化?,c++,c,c++11,floating-point,standards,C++,C,C++11,Floating Point,Standards,这是一个非常幼稚的问题。如果我们查看C和C++标准委员会,他们目前正在致力于增加十进制浮点标准类型: 因此,我们可能会有一个标准化的decimal128类型,而我们还没有任何标准化的binary128类型(四精度,而不是简单的扩展双精度)。这种情况是否有技术原因,或者纯粹是“政治原因”四精度二进制浮点不能替代十进制类型。精度问题仅次于十进制数的表示。我们的想法是在语言中添加一个类型,以支持像0.1这样的数字表示,而不损失任何精度-这是二进制浮点类型无法做到的,无论其精度有多高 这就是为什

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


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

四精度二进制浮点不能替代十进制类型。精度问题仅次于十进制数的表示。我们的想法是在语言中添加一个类型,以支持像
0.1
这样的数字表示,而不损失任何精度-这是二进制浮点类型无法做到的,无论其精度有多高

这就是为什么添加decimal类型的讨论与添加quad precision数据类型的讨论是正交的:这两种类型有不同的用途,正如您链接的其中一个方案中所讨论的:

人类对数值的计算和交流几乎总是使用十进制 算术和十进制符号。实验室记录、科学论文、法律文件、商业文件 报告和财务报表都以十进制形式记录数值。当使用数字数据时 给定给程序或显示给用户,需要从二进制到十进制的转换。 此类转换中存在固有的舍入误差;十进制分数不能,在 一般情况下,可以用二进制浮点值精确表示。这些错误通常会导致可用性问题 和效率问题,取决于应用程序


以下是一些简单的原因,解释了为什么有关于小数128而不是128位二进制浮点的工作:

  • IEEE 754(2008)定义了三种基本的十进制浮点格式(32、64和128位)。在添加支持时,将这三种接口标准化似乎是合理的,特别是在没有太大差别的情况下(32位版本没有指定算术)。使用IEEE 754(2008)语义需要十进制浮点支持
  • 当前定义的浮点格式[仍然]不需要遵循IEEE 754语义,甚至没有定义基(有使用基2和基16的实现)。对于不使用IEEE的平台,不清楚该格式将如何扩展。在使用IEEE 754的地方,它是基于IEEE 754(1984)的,该标准仅定义了两种基本格式,并且没有一个提案要求使用第三种格式
  • 长双精度
    的当前定义非常模糊,似乎任何供应商都不会接受将其当前含义更改为使用IEEE 754(2008)128位语义:这将改变几乎所有实现的行为。我预计,对强制使用IEEE 754进行
    浮点
    双浮点
    的反对意见,也就是说,任何IEEE 754对二进制浮点的支持都将是全新的,需要有人提出。我认为这样的建议会有一些争议,例如,关于使用什么名称以及是否实际添加128位支持,因为大多数用户都希望它得到硬件支持,而从事硬件工作的人似乎有其他优先事项。请注意,没有人期望(或应该期望)十进制浮点的硬件支持:尽管Power7和更高版本的处理器上有硬件支持,但没有其他供应商考虑过这个想法
  • 我对使用二进制128位浮点值不感兴趣,也没有任何使用经验。另一方面,我对十进制浮点数很感兴趣并有使用经验(我的经验有点有限,但肯定比使用二进制128位浮点数大)。我的主要用途是使正确计算十进制值变得更容易:是的,我意识到正确使用二进制浮点和/或整数是可能的,但实际上几乎没有人正确地进行这些计算,而且做正确的数学几乎是微不足道的。考虑到添加128位二进制浮点将需要大量工作,并可能危及联合提案,我不打算添加它们。当然,这并不意味着其他人不能做这项工作
  • 虽然二进制浮点数可能是精确的,但它们主要用于快速计算,舍入是可以接受的。丢失一些碎片似乎是可以接受的。我意识到,一些应用程序将受益于更大范围的值,但这一论点将产生对位的无限支持。对于十进制浮点,这种推理是不同的:使用它们的唯一原因是精确的算术,实际上通常使用的运算集相当有限。不太快的计算比错误的结果更容易接受。虽然16位数字对于大多数用途来说已经足够了,但实际上已经有一些用途稍微超过16位或非常接近。我猜这一推理导致IEEE754上的工作人员在最初添加十进制浮点时包含128位十进制浮点,而在最初标准化二进制浮点时没有使用类似的推理

  • tl;dr:关于正在研究的十进制128位格式和二进制128位格式没有什么政治意义:有一个关于其中一种格式的提案,而不是另一种格式,提案人(me)没有兴趣为这两种格式编写提案。

    在ISO C中有一些工作支持IEEE 754-2008,这意味着二进制128(以及更多)可以标准化。看见C++应该遵循,那么.< 现在,虽然binary128有时是实现的,但我怀疑它是否会在一段时间之前用于实践,因为当前的实现完全是软件实现的