Oracle® Developer Studio 12.5:数值计算指南

退出打印视图

更新时间: 2016 年 6 月
 
 

5.2 与 SPARC 的区别

Oracle Developer Studio 编译器生成的代码在 SPARC 和 x86 上的行为方式通常是相同的。但是,请注意在基于 x86 的系统上有以下重要区别:

  • x87 浮点寄存器的宽度为 80 位。因为使用 x87 浮点寄存器栈时算术计算的中间结果可能采用双扩展(80 位)精度,所以计算结果可能会有所不同。–fstore 标志将最小化这些差异。但是,使用 –fstore 标志会导致性能下降。虽然 Oracle Developer Studio 12.5 在缺省情况下不使用 x87 寄存器进行单精度和双精度表达式求值,但如果指定了 –xarch=386,或使用了 x87 硬件超越指令,或使用了双精度扩展变量,就会使用这些寄存器。

  • 每次将单精度或双精度浮点数加载到 x87 浮点寄存器栈或存储到内存中时,都会转换到双扩展(80 位)精度或从双扩展精度进行转换。因此,加载和存储浮点数可能导致异常。使用 –m32 时,浮点子例程操作数和结果将在 x87 寄存器中传递。

  • 在使用 x87 浮点寄存器栈时,将通过微码协助在硬件中实现渐进下溢;没有非标准模式。

  • 不提供 fpversion 实用程序。

  • 双扩展(80 位)格式接受某些不表示任何浮点值的位模式(请参见表 8)。硬件通常将这些“不受支持的格式”视为信号 NaN,但是数学库在处理这样的表示形式时存在不一致。由于这些位模式不会由硬件生成,因此它们只能产生于无效的内存引用(例如在读取数组时发生越界),或者产生于显式将内存中的数据从一种类型强制转换为另一种类型(例如,通过 C 语言中的 union 数据结构)。因此,在大多数数值程序中,不出现这些位模式。