代码之家  ›  专栏  ›  技术社区  ›  gnovice

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

  •  15
  • gnovice  · 技术社区  · 17 年前

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

    我对浮点变量的经验总是涉及到4字节的乘法,比如单字节(32位)、双字节(64位)和长双字节(我看到的是96位或128位)。这就是为什么当我遇到一个 80-bit extended precision data type 当我在写一些代码读写的时候 AIFF (Audio Interchange File Format) files :选择扩展精度变量来存储音频曲目的采样率。

    IEEE 754-1985 standard 摘要(但不在 IEEE 754-2008 standard 总结)。在某些体系结构上,“扩展”和“长双精度”似乎是同义词。

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

    • 是否有人遇到过扩展精度对于某些编程应用程序是必要的/有益的情况?
    • 除了明显的“它比double精度高一点,但比大多数长double实现的字节少”之外,80位浮点数还有什么好处?
    6 回复  |  直到 5 年前
        1
  •  24
  •   oefe    17 年前

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

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

        2
  •  9
  •   thb    14 年前

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

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

        3
  •  5
  •   Nathan Kitchen    17 年前

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

        4
  •  2
  •   supercat    11 年前

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

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

        5
  •  1
  •   DarenW    16 年前

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