如果预知乘法(或减法)中的操作数可能会很小并且很可能会下溢,可采用双精度进行计算,而后再将结果转换成单精度。
例如,类似下面的点积循环:
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
|
鉴于以软件方式解决了原始循环造成的过度下溢,这样做还有可能提高性能。但是,对此并无绝对而快速的法则;只能通过对计算代码进行高强度实验来确定最有利的解决方案。