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

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

当我浏览 Wikipedia 时,我发现了上面的链接以及 80 位格式的简短提及 IEEE 754-1985 标准 摘要(但不在 IEEE 754-2008标准 概括)。看来在某些体系结构上“扩展”和“长双精度”是同义词。

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

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

解决方案

Intel 的 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 位尾数的算术将比跨相同数量寄存器但具有 53 位尾数的算术更快与符号和指数共享 12 个寄存器位。对于不需要比更精确的东西的应用程序 float, ,48 位“扩展浮点”类型上的计算同样可以比 32 位上的计算更快 float.

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

我使用 80 位进行一些纯数学研究。我必须对一个无限级数中的项进行求和,该级数变得非常大,超出了双精度数的范围。收敛性和准确性不是问题,只是处理像 1E1000 这样的大指数的能力。也许一些聪明的代数可以简化事情,但是编写具有扩展精度的算法比花时间思考要快得多、容易得多。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top