这里有一小段代码,它返回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的最新(快照)版本进行了测试。
有人可以向我解释这个问题吗?
答案 0 :(得分:2)
浮点算术有许多微妙的问题。一种形式的源代码可以生成与另一种看似几乎相同的源代码不同的机器指令。例如,“d”可能存储到存储器位置,而“1.0 + eps”可能仅使用寄存器进行评估......这可能导致不同的精度。
更一般地说,为什么不使用为Fortran 95提供的内部函数来揭示特定精度的实数特征呢?