Fortran Coder

标题: 關於時間轉換公式問題 [打印本页]

作者: max533    时间: 2014-10-8 20:20
标题: 關於時間轉換公式問題
由於我有2筆數據,時間是一模一樣的,只是表示方式有點不同

1.變數意義如下:
yr(代表西元年分)  dayofyear(代表一年365天的第幾天)
Days_Of_year(代表一年有365或366天)  hr(代表一天中第幾個小時)

2.轉換公式:
[Fortran] 纯文本查看 复制代码
timeall = REAL(yr)+(REAL(dayofyear)-0.99)/Days_Of_Year+REAL(hr)/(Days_Of_Year*24)


3.數據大概如下:

yr       dayofyear   Days_Of_Year   hr

1994   001            365                 24
1994   002            365                 00

透過此算式在fortran計算轉換後,輸出的time_all 照理來說該是要一模一樣,但卻不太一樣,
令人感到困惑,是否有哪位高手能幫忙解答呢?!

作者: 楚香饭    时间: 2014-10-8 21:23
[Fortran] 纯文本查看 复制代码
Program www_fcode_cn
  Implicit none
  write(*,*) timeall( 1994 , 1 , 365 , 24 )
  write(*,*) timeall( 1994 , 2 , 365 , 0 )
contains
  real function timeall( yr , dayofyear , Days_Of_Year , hr )
    integer :: yr , dayofyear , Days_Of_Year , hr
    timeall = REAL(yr)+(REAL(dayofyear)-0.99)/Days_Of_Year+REAL(hr)/(Days_Of_Year*24)
  end function  timeall
End Program www_fcode_cn  


运行后结果为
   1994.00281   
   1994.00281   

感觉没有问题
作者: max533    时间: 2014-10-8 21:46
這是我的程式碼,不過算出來卻有點怪異,是因為我少注意到哪邊嗎?!
他是一段副程式

[Fortran] 纯文本查看 复制代码
subroutine convertday (yr,mon,day,hr,timeall,dayofyear)
  
  INTEGER :: yr,mon,day,hr,dayofyear
  REAL*8 :: timeall
  Integer :: DAY_OF_MONTH(12) , Days_Of_Year
  DAY_OF_MONTH = (/31,28,31,30,31,30,31,31,30,31,30,31/)   
  if (MOD(yr,4)==0 .and. MOD(yr,100)/=0) then
     DAY_OF_MONTH(2) = 29
     Days_Of_Year = 366
  else if(MOD(yr,4)==0 .and. MOD(yr,100)==0 .and. MOD(yr,400)==0) then
     DAY_OF_MONTH(2) = 29
     Days_Of_Year = 366
  else !(MOD(yr,4)==0 .and. MOD(yr,100)==0 .and. MOD(yr,400)/=0) then
     Days_Of_Year = 365     
  end if
   
  if ( mon > 1 ) then
    dayofyear = day + sum( DAY_OF_MONTH(1:mon-1) )
  else
    dayofyear = day
  end if
    timeall = REAL(yr)+(REAL(dayofyear)-0.99)/Days_Of_Year+REAL(hr)/(Days_Of_Year*24)
end subroutine

作者: 楚香饭    时间: 2014-10-8 22:14
如果你用双精度,需要把常数也改成双精度。

[Fortran] 纯文本查看 复制代码
timeall = yr*1.0D0+(dayofyear-0.99D0)/Days_Of_Year + 1.0D0*hr/(Days_Of_Year*24.0D0)

作者: max533    时间: 2014-10-9 14:00
楚香饭 发表于 2014-10-8 22:14
如果你用双精度,需要把常数也改成双精度。

[mw_shl_code=fortran,true]timeall = yr*1.0D0+(dayofyear-0. ...

感謝您的解答,楚香饭大大。




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2