關於時間轉換公式問題
由於我有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 照理來說該是要一模一樣,但卻不太一樣,
令人感到困惑,是否有哪位高手能幫忙解答呢?!
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
感觉没有问题 這是我的程式碼,不過算出來卻有點怪異,是因為我少注意到哪邊嗎?!
他是一段副程式
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 如果你用双精度,需要把常数也改成双精度。
timeall = yr*1.0D0+(dayofyear-0.99D0)/Days_Of_Year + 1.0D0*hr/(Days_Of_Year*24.0D0) 楚香饭 发表于 2014-10-8 22:14
如果你用双精度,需要把常数也改成双精度。
timeall = yr*1.0D0+(dayofyear-0. ...
感謝您的解答,楚香饭大大。
页:
[1]