2011-02-06 22 views
2

這裏的代碼,對於一個真實值返回的ε-()一個小片段:的Fortran 95:直列評價如果條件

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 (1.0+eps==1.0) then 
更換如果條件

該程序應該有相同的回報,但不幸的是它不!我在Linux和Windows上使用g95的最新(快照)發行版進行了測試。

有人可以向我解釋這個問題嗎?

回答

2

浮點算法有許多微妙的問題。一種形式的源代碼可以產生與另一個看起來幾乎相同的源代碼不同的機器指令。例如,「d」可能會被存儲到內存位置,而「1.0 + eps」可能僅通過寄存器進行評估......這會導致不同的精度。更一般地說,爲什麼不使用爲Fortran 95提供的內部函數來揭示reals特定精度的特性?

+0

謝謝M.S.B.! 我知道這些內在功能,如epsilon(),但我想這個程序是爲了向我展示你剛剛澄清的內容:內聯評估可能會導致錯誤的結果。 – mikemike 2011-02-06 23:55:42