我现在正在为某些迭代运行一个程序。时间步长为0.01。我想在达到特定时间时写一些信息。例如:
program abc
implicit none
double precision :: time,step,target
integer :: x
time = 0.d0
step = 0.01
target = 5.d0
do x = 1,6000
time = time + step
"some equations here to calculate the model parameters"
if(time.eq.target)then
write(*,*) "model parameters"
endif
enddo
然而,"时间"永远不等于1.0或2.0等等。它显示为" 0.999999866"而不是" 1.0"和" 1.99999845"而不是" 2.0"。
虽然我可以使用整数" x"要定义何时写入信息,我更喜欢使用时间步。另外,我可能想要更改时间步长(0.01 / 0.02 / 0.05 /等)或目标(5.0 / 6.0 / 8.0 /等)。
有谁知道如何解决这个问题?谢谢。
答案 0 :(得分:3)
您现在已经发现了浮点运算!只需确保时间足够接近目标。
if(abs(time-target) < 0.5d0*step ) then
...
应该这样做。
答案 1 :(得分:1)
浮点运算并不完美,并且您的变量始终精确到某个机器错误,具体取决于变量的数字格式(32,64,128位)。以下示例很好地说明了这一特征:
PROGRAM main
USE, INTRINSIC :: ISO_FORTRAN_ENV, qp => real128
IMPLICIT NONE
REAL(qp) :: a, b, c
a = 128._qp
b = a/120._qp + 1
c = 120._qp*(b-1)
PRINT*, "a = ", a
PRINT*, "c = ", c
END PROGRAM main
以下是此程序的输出gfortran v.4.6.3
:
a = 128.00000000000000000
c = 127.99999999999999999