max533 发表于 2014-10-8 20:20:21

關於時間轉換公式問題

由於我有2筆數據,時間是一模一樣的,只是表示方式有點不同

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

2.轉換公式: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:15

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 functiontimeall
End Program www_fcode_cn

运行后结果为
   1994.00281   
   1994.00281   

感觉没有问题

max533 发表于 2014-10-8 21:46:57

這是我的程式碼,不過算出來卻有點怪異,是因為我少注意到哪邊嗎?!
他是一段副程式

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:19

如果你用双精度,需要把常数也改成双精度。

timeall = yr*1.0D0+(dayofyear-0.99D0)/Days_Of_Year + 1.0D0*hr/(Days_Of_Year*24.0D0)

max533 发表于 2014-10-9 14:00:08

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

timeall = yr*1.0D0+(dayofyear-0. ...

感謝您的解答,楚香饭大大。
页: [1]
查看完整版本: 關於時間轉換公式問題