Fortran Coder

查看: 5555|回复: 4
打印 上一主题 下一主题

[通用算法] 關於時間轉換公式問題

[复制链接]

35

帖子

12

主题

0

精华

熟手

F 币
173 元
贡献
117 点
跳转到指定楼层
楼主
发表于 2014-10-8 20:20:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
由於我有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 照理來說該是要一模一樣,但卻不太一樣,
令人感到困惑,是否有哪位高手能幫忙解答呢?!
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

712

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
607 元
贡献
311 点

新人勋章爱心勋章水王勋章元老勋章热心勋章

沙发
发表于 2014-10-8 21:23:15 | 只看该作者
[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   

感觉没有问题

35

帖子

12

主题

0

精华

熟手

F 币
173 元
贡献
117 点
板凳
 楼主| 发表于 2014-10-8 21:46:57 | 只看该作者
這是我的程式碼,不過算出來卻有點怪異,是因為我少注意到哪邊嗎?!
他是一段副程式

[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 

712

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
607 元
贡献
311 点

新人勋章爱心勋章水王勋章元老勋章热心勋章

地板
发表于 2014-10-8 22:14:19 | 只看该作者
如果你用双精度,需要把常数也改成双精度。

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

35

帖子

12

主题

0

精华

熟手

F 币
173 元
贡献
117 点
5#
 楼主| 发表于 2014-10-9 14:00:08 | 只看该作者
楚香饭 发表于 2014-10-8 22:14
如果你用双精度,需要把常数也改成双精度。

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

感謝您的解答,楚香饭大大。
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-4-20 05:56

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表