增加双精度值

时间:2016-03-03 06:25:56

标签: fortran fortran95

我现在正在为某些迭代运行一个程序。时间步长为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 /等)。

有谁知道如何解决这个问题?谢谢。

2 个答案:

答案 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