Sun Studio 12:Fortran 编程指南

6.5.1 避免简单下溢

有些应用程序实际上执行了许多非常接近零的计算。这在计算残数或微分修正的算法中很常见。为获得在数值上安全的最大性能,需要采用扩展精度运算来执行关键计算。如果应用程序是单精度应用程序,可采用双精度执行关键计算。

示例:采用单精度的简单点积计算:


      sum = 0
      DO i = 1, n
         sum = sum + a(i) * b(i)
      END DO

如果 a(i)b(i) 非常小,会出现很多下溢。通过强制计算采用双精度,计算点积时会具有更高的准确性,并且可避免出现下溢情况:


      DOUBLE PRECISION sum
      DO i = 1, n
         sum = sum + dble(a(i)) * dble(b(i))
      END DO
      result = sum

通过增加对库例程 nonstandard_arithmetic() 的调用,或通过使用 -fns 选项编译应用程序的主程序,可以强制 SPARC 处理器在涉及到下溢时(存储零)像较早的系统一样进行处理。