Floating point 80位扩展精度数据类型的应用/好处是什么?

Floating point 80位扩展精度数据类型的应用/好处是什么?,floating-point,ieee-754,x87,long-double,extended-precision,Floating Point,Ieee 754,X87,Long Double,Extended Precision,是的,我想说80位。那不是打字错误 我对浮点变量的经验总是涉及到4字节的乘法,比如单字节(32位)、双字节(64位)和长双字节(我看到的是96位或128位)。这就是为什么当我在编写一些读写代码时,我会有点困惑:选择了一个扩展精度变量来存储音频轨道的采样率 当我浏览维基百科时,我发现了上面的链接,并在摘要中简要提到了80位格式(但不在摘要中)。在某些体系结构上,“扩展”和“长双精度”似乎是同义词 有一件事我没有遇到过,那就是使用扩展精度数据类型的特定应用程序(当然,AIFF文件采样率除外)。这让我

是的,我想说80位。那不是打字错误

我对浮点变量的经验总是涉及到4字节的乘法,比如单字节(32位)、双字节(64位)和长双字节(我看到的是96位或128位)。这就是为什么当我在编写一些读写代码时,我会有点困惑:选择了一个扩展精度变量来存储音频轨道的采样率

当我浏览维基百科时,我发现了上面的链接,并在摘要中简要提到了80位格式(但不在摘要中)。在某些体系结构上,“扩展”和“长双精度”似乎是同义词

有一件事我没有遇到过,那就是使用扩展精度数据类型的特定应用程序(当然,AIFF文件采样率除外)。这让我想知道:

  • 是否有人遇到过扩展精度对于某些编程应用程序是必要的/有益的情况
  • 除了明显的“它比double精度高一点,但比大多数长double实现的字节少”之外,80位浮点数还有什么好处
  • 它的适用性正在减弱吗

80位格式可以表示整个64位整数,而不会丢失信息。因此,CPU的浮点单元可用于实现整数的乘法和除法。

英特尔的FPU在内部使用80位格式,以获得更高的中间结果精度

也就是说,您可能有32位或64位变量,但当它们加载到FPU寄存器时,它们会转换为80位;然后,FPU(默认情况下)执行80中的所有计算,但:;计算后,结果存储回32位或64位变量中


顺便说一句——这有点令人遗憾的结果是,调试和发布版本可能会产生稍有不同的结果:在发布版本中,优化器可能会在80位FPU寄存器中保留一个中间变量,而在调试版本中,它将存储在64位变量中,从而导致精度损失。您可以通过使用80位变量或使用FPU开关(或编译器选项)以64位执行所有计算来避免这种情况。

我在一些纯数学研究中使用了80位。我必须在一个无限级数中求和,这个级数增长得相当大,超出了双倍的范围。收敛性和准确性不是问题,只是处理1E1000等大指数的能力。也许一些聪明的代数可以简化事情,但只编写一个扩展精度的算法要比花时间思考它快得多,也容易得多。

对我来说,80位的使用是必不可少的。通过这种方式,当使用GOTO库进行向量内积时,我得到了对称矩阵的高阶(30000)特征值和特征向量,还有四个数字,即13,而不是我在相对论原子计算中使用的那种矩阵的9个有效数字,这对于避免落入负能量状态的海洋是必要的。我的另一个选择是使用四倍精度的算法,这会将CPU时间增加60-70倍,同时也会增加RAM需求。任何依赖于大向量内积的计算都将受益。当然,为了将部分内积结果保存在寄存器中,有必要使用汇编语言,就像GOTO库中一样。这就是我如何爱上我的老Opteron 850处理器的原因,我将使用它,只要它们能在我的计算中持续使用


80位之所以快,而更高的精度却慢得多,是因为CPU的标准浮点硬件有80位寄存器。因此,如果您想要额外的16位(尾数的11位额外、指数的4位额外和一位有效未使用的额外位),那么从64位扩展到80位实际上并不需要太多成本——而从运行时间的角度来看,扩展到80位之外的成本非常高。因此,如果需要,还可以使用80位精度。使用它不是免费的,但它非常便宜。

80位类型还没有提到的另一个优点是,在没有浮点单元但有“乘法”指令的16位或32位处理器上,产生的结果是操作数的两倍(16x16->32或32x32->64),64位尾数再细分为四个或两个16位或32位寄存器的算术运算速度将快于53位尾数的算术运算,53位尾数跨越相同数量的寄存器,但必须与符号和指数共享12个寄存器位。对于不需要比
浮点
更精确的应用程序,48位“扩展浮点”类型的计算也可能比32位
浮点
的计算更快


虽然有些人可能会抱怨扩展精度类型的双舍入行为,但实际上,这只是需要完全位精确跨平台再现性的专业应用中的一个问题。从准确度的角度来看,64/128与65/128之间的舍入误差,或1024/2048ulp与1025/2048之间的舍入误差之间的差异不是问题;在具有扩展精度变量类型和一致的扩展精度语义的语言中,在许多没有浮点硬件的平台(例如嵌入式系统)上使用扩展类型将提供比单精度或双精度浮点类型更高的精度和更快的速度。

我明白了,因此,一个80位FPU可以为高达64位的整数运算提取双占空比。酷。听起来像是维基百科页面提到的涉及“算术行为细微差异”的“副作用”之一那么,既然IEEE 754-2008规范提到128位“四”格式,我们是否应该期待80位FPU很快被淘汰呢?我不知道该标准的发展方向,但我想