What are the applications/benefits of an 80-bit extended precision data type?
是的,我的意思是说80位。这不是错字...
我对浮点变量的经验一直涉及4字节的倍数,例如单打(32位),双打(64位)和长双打(我将其称为96位或128位)。这就是为什么当我在处理一些用于读写AIFF(音频交换文件格式)文件的代码时遇到80位扩展精度数据类型时,我有些困惑的原因:选择了扩展精度变量来存储采样音轨的速率。
浏览Wikipedia时,在IEEE 754-1985标准摘要(但未在IEEE 754-2008标准摘要中)中找到上面的链接以及对80位格式的简短提及。似乎在某些架构上,"扩展"和"长双精度"是同义词。
我没有遇到的一件事是利用扩展精度数据类型的特定应用程序(当然,除了AIFF文件采样率)。这使我想知道:
- 有没有人遇到过这样的情况,对于某些编程应用程序来说,必须提高精度是有益的?
- 80位浮点数的好处是什么,除了显而易见的"它比双精度多一点,但比长双精度的大多数实现更少的字节"之外,还有什么呢?
- 它的适用性在减弱吗?
英特尔的FPU内部使用80位格式,以提高中间结果的精度。
也就是说,您可能具有32位或64位变量,但是当将它们加载到FPU寄存器中时,它们将转换为80位。然后,FPU(默认情况下)执行80中的所有计算,但是;计算后,结果将存储回32位或64位变量中。
顺便说一句-这样做的一个不幸的后果是调试和发布版本可能会产生稍微不同的结果:在发布版本中,优化器可能会将中间变量保留在80位FPU寄存器中,而在调试版本中,它将被存储在64位变量中,会导致精度损失。您可以通过使用80位变量或使用FPU开关(或编译器选项)以64位执行所有计算来避免这种情况。
对我来说,使用80位是必不可少的。这样,当我使用GOTO库作为向量内积时,我得到了对称矩阵的高阶(30,000)特征值和特征向量,还有四个数字,即相对论原子中使用的矩阵类型的13个有效数字而不是9个有效数字计算,这是避免掉入负能量状态海洋的必要条件。我的另一个选择是使用四精度算法,该算法将CPU时间增加60-70倍,并且还增加了RAM需求。任何依赖于大向量的内积的计算都将受益。当然,为了将部分内部乘积结果保留在寄存器中,必须像GOTO库中一样使用汇编语言。这就是我爱上旧的Opteron 850处理器的方式,只要它们能在我的计算中一直使用,我就会一直使用它们。
80位速度快,而精度却慢得多的原因是,CPU的标准浮点硬件具有80位寄存器。因此,如果您需要额外的16位(11个尾数位,4个指数位和1个有效位),那么从64位扩展到80位并不需要花费太多,而要扩展在运行时间方面,超过80位将非常昂贵。因此,如果需要,您也可以使用80位精度。它不是免费使用,但价格却很便宜。
维基百科解释说,一种80位格式可以表示整个64位整数而不会丢失信息。因此,CPU的浮点单元可用于实现整数的乘法和除法。
对于80位类型,尚未提及的另一个优点是,在没有浮点单元但具有"乘"指令的16位或32位处理器上,其结果的长度是操作数的两倍(16x16 -> 32或32x32-> 64),细分为四个或两个16位或32位寄存器的64位尾数的算术运算比跨越相同数量寄存器但具有与符号和指数共享12个寄存器位。对于不需要比
尽管有些人可能会抱怨扩展精度类型的双重舍入行为,但实际上这只是在需要完全精确的跨平台可再现性的专业应用程序中出现的问题。从精度的角度来看,舍入误差为64/128与65/128或1024 / 2048ulp与1025/2048之间的差值不是问题;在具有扩展精度变量类型和一致的扩展精度语义的语言中,在没有浮点硬件(例如嵌入式系统)的许多平台上使用扩展类型将比单精度或双精度浮点提供更高的准确性和更好的速度。类型。
我使用80位进行一些纯数学研究。我必须对一个无限大的序列进行求和,该序列变得很大,超出了双精度数的范围。收敛性和准确性不是问题,只是处理1E1000等大型指数的能力。也许一些聪明的代数可以简化一些事情,但是比花时间去思考它,用一种扩展的精度对算法进行编码要更快,更容易。