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

时间:2009-03-04 21:25:45

标签: floating-point ieee-754

是的,我打算说 80位。这不是一个错字......

我对浮点变量的经验总是涉及4字节的倍数,如单音(32位),双音(64位)和长双音(我看到它被称为96位或128位) )。这就是为什么当我遇到一些代码来读写80-bit extended precision data type时遇到AIFF (Audio Interchange File Format) files时我有点困惑:选择扩展精度变量来存储音轨的采样率

当我浏览维基百科时,我在IEEE 754-1985 standard摘要中找到了上面的链接以及80位格式的简要提及(但不在IEEE 754-2008 standard摘要中)。看来,在某些架构中,“扩展”和“长双”是同义词。

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

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

6 个答案:

答案 0 :(得分:24)

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

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

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

答案 1 :(得分: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位精度。它使用起来并不是免费的,但它非常便宜。

答案 2 :(得分:5)

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

答案 3 :(得分:2)

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

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

答案 4 :(得分:1)

我使用80位进行一些纯粹的数学研究。我不得不在无限系列中总结术语,这些系列在双打范围之外变得非常大。融合和准确性不是问题,只是能够处理像1E1000这样的大型指数。也许一些聪明的代数可以简化一些事情,但是只需要花费任何时间思考它就可以更快更容易地编写具有扩展精度的算法。

答案 5 :(得分:0)

我有一位正在这方面工作的朋友。他正在开发一个库来处理大小为千兆字节的浮点数。 当然,这是与科学计算有关的事情(用等离子计算),可能只有这种计算才能使用这么大的数字......