80位扩展精度数据类型有哪些应用/优点?

gno*_*ice 15 floating-point ieee-754

是的,我的意思是说80位.这不是一个错字......

我对浮点变量的经验总是涉及4字节的倍数,如单音(32位),双音(64位)和长双音(我已经看到它被称为96位或128位).这就是为什么当我遇到一些代码来读取和写入AIFF(音频交换文件格式)文件时遇到80位扩展精度数据类型时我有点困惑:选择了一个扩展精度变量来存储采样音轨的速率.

当我浏览维基百科时,我发现上面的链接以及IEEE 754-1985标准摘要中的80位格式的简要提及(但不在IEEE 754-2008标准摘要中).看来,在某些架构上,"扩展"和"长双"是同义词.

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

  • 有没有人遇到过扩展精度对某些编程应用来说是必要/有益的情况?
  • 80位浮点数有什么好处,除了显而易见的"它比双倍的精度稍高但比大多数长双精度的实现更少"?
  • 它的适用性正在减弱吗?

oef*_*efe 24

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

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

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

  • 听起来像维基百科页面提到的涉及"算术行为的微妙差异"的"副作用"之一.=)因此,由于IEEE 754-2008规范提到了128位"四"格式,我们是否应该期待80位FPU很快被逐步淘汰? (2认同)
  • @gnovice:不太可能;80 位格式仍然是有效的 IEEE-754 (2008) 类型。具体来说,它是 IEEE-754 标准允许的“binary64 扩展”类型的众多选项之一。也就是说,大多数平台要么使用或正在转向使用 SSE(本机 32 位和 64 位)进行浮点计算,因为它提供更好的性能。 (2认同)

小智 9

对我来说,使用80位是必不可少的.这样,当使用GOTO库用于向量内积时,我得到对称矩阵的高阶(30,000)特征值和特征向量,其中有四个数字,即13,而不是我在相对论原子中使用的矩阵的9个有效数字计算,这是避免落入负能量状态的必要条件.我的另一个选择是使用四倍精度算法,将CPU时间增加60-70倍,并且还增加了RAM要求.任何依赖大型载体内积的计算都会受益.当然,为了在寄存器中保留部分内积结果,必须使用汇编语言,如GOTO库中那样.这就是我喜欢我的旧Opteron 850处理器的方式,只要它们用于我计算的那部分,我就会使用它.

80位是快速的,而更高的精度是如此慢得多,因为CPU的标准浮点硬件具有80位寄存器.因此,如果你想要额外的16位(11个额外的尾数位,4个额外的指数位和1个有效未使用的位),那么从64位扩展到80位并不会花费太多 - 而是要扩展超过80位在运行时方面是非常昂贵的.因此,如果需要,您也可以使用80位精度.使用它不是免费的,但它相当便宜.

  • 在许多情况下,重写库以利用 SIMD 指令会比使用扩展精度带来更多的加速。选择如何在 SSE/AVX 寄存器中明智地以四倍/扩展精度存储肢体将允许您同时使用多个值进行算术运算 (3认同)
  • 或者只使用[双精度算术](https://en.wikipedia.org/wiki/Quadruple- precision_floating-point_format#Double-double_arithmetic)。这将提供略低于四倍精度的精度,但速度显着提高[使用 2 个“float”模拟“double”](http://stackoverflow.com/q/6769881/995714)、[float128 和 double-double 算术](http://stackoverflow.com/q/31647409/995714),http://stackoverflow.com/q/9857418/995714。有很多更好的解决方案,你只需要做足够的研究 (2认同)

Nat*_*hen 5

维基百科解释说,80位格式可以代表整个64位整数而不会丢失信息.因此,CPU的浮点单元可用于实现整数的乘法和除法.