ユリウス通日に関して、元ネタでは紀元前1年の3月1日を0日目として計算するアルゴリズムが紹介されているようです。ところがWikipediaで調べてみると、実際には、ユリウス日はユリウス暦紀元前4713年1月1日の正午から、修正ユリウス日は西暦1858年11月17日の0:00からの通日になっているようです。今回はWikipediaの記事に基づいて関数を実装し、ke!sanのサービスを使って検算を行いました。
まずは修正ユリウス日を求める関数を実装してみます。
0 1 2 3 4 5 6 7 8 9 10 |
double gregorian_to_mjd(int y, int m, int d) { if (m < 3) { --y; m += 12; } return std::floor(365.25*y) + std::floor(y/400.0) - std::floor(y/100.0) + std::floor(30.59*(m - 2)) + d - 678912; } |
いつもは1月を0としていますが、今回の記事では1月は1として扱っていますのでその点は注意が必要です。1月を0として扱うには関数の内部でmに1を足してください。
先ほどの関数はあくまでも修正ユリウス日でした。これを(修正ではない)ユリウス日に直すには、2400000.5を足して上げればOKです。
0 1 2 3 4 5 |
double gregorian_to_jd(int y, int m, int d) { return gregorian_to_mjd(y, m, d) + 2400000.5; } |
最後に、ユリウス暦から修正ユリウス日を求める関数も実装してみます。
0 1 2 3 4 5 6 7 8 9 10 |
double julian_to_mjd(int y, int m, int d) { if (m < 3) { --y; m += 12; } return std::floor(365.25*y) + std::floor(30.59*(m - 2)) + d - 678914; } |
検算はWikipediaの例にあった1582年2月1日を入力して行いました。(修正ではない)ユリウス日への変換関数は割愛します。
今回はほとんどC++は関係ありませんでしたが、まあ良しとしましょう。