N88-BASICでユリウス日(JD) (1回目)

2021/9/24(金)
N88-BASICでユリウス日(JD) (1回目)
 
ユリウス(Julius)日(JD)を求めます
 
以後ガウス記号[]を使用します
[a]はBASICではINT(a)、Cではfloor(a)
で、aを超えない最大の整数です
[1.9] = 1、[-1.9] = -2
 
ユリウス日(JD)
紀元前4713(-4712)年1月1日(月)12:00(世界時) = 0日
とする通算日数(時間は小数で表し0.5は12時間)
紀元前4713年1月1日0:00 = -0.5日
 
紀元前2年 = -1年
紀元前1年 = 0年
   1年 = 1年
   2年 = 2年
とします
 
天文学では夜中に観測するので観測途中に日付が
変わらないように0:00ではなく12:00に日付が
変わるようにしていたが、現在廃止されている
のに、ユリウス日はそのまま使っているようです
ユリウス日も0:00起点に修正してほしかったです
 
ユリウス暦
紀元前45年1月1日 - 1582年10月4日(木)
1年(約365.24219日)を365.25日(365 + 1/4)で近似
4で割切れる年を閏年とする
4年毎に閏年が来る
1582年10月4日(木)の次の日は1582年10月15日(金)
 
グレゴリオ暦
1582年10月15日(金) - 現在
1年(約365.24219日)を365.2425日
(365 + 0.25 - 0.01 + 0.0025)
(365 + 1/4 - 1/100 + 1/400)で近似
400で割切れる年を閏年または、
4で割切れて100で割切れない年を閏年とする
4年毎に閏年が来、100年毎に閏年が来なくて
400年毎に閏年が来る
 
ユリウス日 ,  年,月,日
JD   -0.5, -4712, 1, 1
JD    0 , -4712, 1, 1.5 JD元期
JD 1721117.5,   0, 3, 1
JD 1721423.5,   1, 1, 1
JD 2299159.5, 1582,10, 4  ユリウス暦 (最終日)
JD 2299160.5, 1582,10,15  グレゴリオ暦(開始日)
JD 2400000.5, 1858,11,17  修正ユリウス日元期
JD 2451544.5, 2000, 1, 1
JD 3000000.5, 3501, 8,16
 
ユリウス日の計算を考えていきます
 
まず、
YY/MM/DDを年(西暦)、月、日とする
MM = 1月, 2月 を前年の13月, 14月とし、
3月~14月を1年と考えると、閏年に追加される
1日が年の最終日となり計算しやすくなります
この年をJY、3月から14月をJMと
置くことにします
 
次に月の日数の数列を発生する式を考えます
 
初項a=30.5公差d=30.5の等差数列の整数部分の
数列(一般項an=[30.5n])は30, 61, 91, 122となり
その階差数列(数列の差の数列)は、31と30が
交互に現れます
 
a=d=30.7だと31が3回続きます
 
a=d=30.6だと31が1,2回現れますが、
5回ごとに整数が現れるので誤差で、
たとえば、153が152.9999...になり整数部分が
152になってしまうかもしれません
 
a=d=30.61だと.9~がでてきて誤差で繰り上がる
かもしれません
 
a=d=30.601ぐらいが良いかと思います
a=d=30.601の時の数列(一般項an=[30.5n])の
階差数列に月を割り当てると、
31 30 31 31 30 31 30 31 31 30 31 30 31 31
     3 4 5 6 7 8 9 10 11 12 13
     ↑ここまでの分の30.601×4=122.404
      の整数部分を引いて表を作ると、
 
JM 日 通日 i 30.601×i-122
 3 31  0 4  0.404
 4 30 31 5 31.005
 5 31 61 6 61.606
 6 30 92 7 91.207
 7 31 122 8 122.808
 8 31 153 9 153.409
 9 30 184 10 184.010
10 31 214 11 214.611
11 30 245 12 245.212
12 31 275 13 275.813
13 31 306 14 306.414
14 // 337 15 337.015
 
30.601×i-122の整数部分が通日と
して使えます(i = JM + 1)
 
JY YY(2月)日数/年 0.25×JY [0.25×JY]
-5 -4 366    -1.25    -2
-4 -3 365    -1     -1
-3 -2 365    -0.75    -1
-2 -1 365    -0.5    -1
-1 0 366    -0.25    -1
 0 1 365    0      0
 1 2 365    0.25    0
 2 3 365    0.5     0
 3 4 366    0.75    0
 4 5 365    1      1
 5 6 365    1      1
 6 7 365    1      1
 7 8 366    1.75    1
 8 9 365    2      2
なので、
JY×365.25の整数部分は
JY/JM/DD = 0/3/1 = YY/MM/DDから
JY/JM/DD = JY/3/1 = YY/MM/DD
の前日までの日数に一致します
 
YY/MM/DD = 0/3/1 = JY/JM/DD = JD1721117.5
のとき、
[365.25JY] + [30.601(JM+1)] - 122 + DD
は1になります
よって、
JD = [365.25JY] + [30.601(JM+1)] + DD
  - 122 - 1 + 1721117.5
 
JD 2299159.5(1582/10/4)ユリウス暦最終日
が終わるまで、つまり、
JD 2299160.5(1582/10/15)グレゴリオ暦開始日
になる直前までは、上記JDがユリウス日です
 
それ以降はグレゴリオ暦の閏年の計算をします
 
[JY / 100]は、JY年までに100(century)で
割切れる年(4年に1回の閏年が来ない年)が
何回あったかを表します
更に、[JY / 400]は400年に1回来る閏年の
回数を表します
 
JY  YY( 2月) [JY / 100] [JY / 400]
1199 1200   11     2
1200 1201   12     3
となり、YYの前年までの回数になっています
また、
JY  YY(10月) [JY / 100] [JY / 400]
1582 1582   15     3
ですので、
-[JY / 100]+[JY / 400]を日数に足すと、
1582年10月4日までの-15+3=-12だけ
足しすぎなので-12を引く必要があります
更に、1582年10月4日から15日まで日付が
抜ける分、つまり15日は本来5日なので
10日分多いので10を引きます
 
-[JY / 100] + [JY / 400] - (-12) - 10
= -[JY / 100] + [JY / 400] + 2
をJDに足すと、JDがユリウス日です
 
デバッグ用のデータが多いですが本体は短いです
 










NL-BASICとblg~.zip(juli001.bas)は
このブログ(以下のリンク)から
ダウンロードできます

https://ulprojectmail.blogspot.com
Readme.txtを読んで遊んで下さい

このブログの人気の投稿

NEWS

N88-BASICでゲーム (1回目)