Sun Studio 12:Fortran 编程指南

6.5.3 过度下溢

如果将两个非常小的数字相乘,结果将会出现下溢。

如果预知乘法(或减法)中的操作数可能会很小并且很可能会下溢,可采用双精度进行计算,而后再将结果转换成单精度。

例如,类似下面的点积循环:


  real sum, a(maxn), b(maxn)
  ...
  do i =1, n
      sum = sum + a(i)*b(i)
  enddo

其中,已知 a(*)b(*) 具有小元素,为保持数值准确度,应采用双精度来运行:


  real a(maxn), b(maxn)
  double sum
  ...
  do i =1, n
      sum = sum + a(i)*dble(b(i))
  enddo

鉴于以软件方式解决了原始循环造成的过度下溢,这样做还有可能提高性能。但是,对此并无绝对而快速的法则;只能通过对计算代码进行高强度实验来确定最有利的解决方案。