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

浮動小数点演算には多くの微妙な問題があります。ソースコードの1つの形式は、一見ほぼ同一の別のソースコードとは異なるマシン命令を生成する可能性があります。たとえば、「d」はメモリ位置に格納される可能性がありますが、「1.0 + eps」はレジスタのみで評価される可能性があります...これにより、異なる精度が発生する可能性があります。

より一般的には、Fortran 95に提供されている、実数の特定の精度の特性を開示する組み込み関数を使用してみませんか?

于 2011-02-06T23:44:50.353 に答える