【问题标题】:Increasing the double precision values增加双精度值
【发布时间】:2016-03-03 06:25:56
【问题描述】:

我现在正在为某个迭代运行一个程序。时间步长为 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/etc)或目标(5.0/6.0/8.0/etc)。

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

【问题讨论】:

  • if(x.eq.nint(target/step))

标签: fortran fortran95


【解决方案1】:

您现在已经发现了浮点运算!只需确保时间足够接近目标即可。

if(abs(time-target) < 0.5d0*step ) then ...

应该可以解决问题。

【讨论】:

    【解决方案2】:

    浮点运算并不完美,您的变量总是精确到某个机器错误,具体取决于变量的数字格式(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   
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-03
      • 2013-06-17
      • 2012-05-24
      • 1970-01-01
      相关资源
      最近更新 更多