2

这是一小段代码,它返回 epsilon() 的实际值:

program epstest
real :: eps=1.0, d
do
  d=1.0+eps  
  if (d==1.0) then
    eps=eps*2
    exit
  else
    eps=eps/2
  end if
end do
write(*,*) eps, epsilon(d)
pause
end program

现在,当我将 if 条件替换为

   if (1.0+eps==1.0) then

该程序应该有相同的回报,但不幸的是它没有!我在 Linux 和 Windows 上使用 g95 的最新(快照)版本对其进行了测试。

有人可以向我解释这个问题吗?

4

1 回答 1

2

浮点运算有许多微妙的问题。一种形式的源代码可以生成与另一种看似几乎相同的源代码不同的机器指令。例如,“d”可能会存储到内存位置,而“1.0 + eps”可能仅使用寄存器进行评估......这可能会导致不同的精度。

更一般地说,为什么不使用为 Fortran 95 提供的内在函数,这些函数揭示了特定实数精度的特征?

于 2011-02-06T23:44:50.353 回答