Практика программирования (Бейсик, Си, Паскаль)

       

Вычисление юлианских дат


Существует довольно много алгоритмов преобразования григорианских дат в юлианские, не использующих таблицы. Мы остановимся на трех из них. Алгоритм JDI впервые был опубликован на алгоритмическом языке АЛГОЛ-60 в журнале американской ассоциации вычислительных машин (Fliegel H. F., Van Flandern Т. С. A Machine Algorithm for Processing Calender Dates (algorithm 657). Communications of the ACM, 1968). Позднее он был переведен на ФОРТРАН (Spaeth H. Ausgewaehlte Operations Research-Algorithmen in FORTRAN. Wien, 1975) и послужил прообразом нашей функции JDI. Неформальное описание алгоритма JD2, ориентированное на использование ручных калькуляторов, приводится в книге Ж. Меёса "Астрономические формулы для калькуляторов" (М.: Мир, 1988). Наконец, алгоритм аоз описан в предисловии редактора перевода книги Меёса. Основным недостатком указанных публикаций является отсутствие информации о допустимом временном интервале, на котором тот или иной алгоритм работает правильно. Для определения таких интервалов нам пришлось провести довольно громоздкий вычислительный эксперимент.

Алгоритм JD1

Функция JDI предназначена для вычисления юлианской даты по году (Y), номеру месяца (м) и номеру дня месяца (о) на 12 часов полудня. Вместо неформального описания алгоритма JDI ниже приводится текст соответствующей функции JDI.C, содержащей всего три строки. При переводе фортрановской программы потребовалась аккуратность с явным заданием типа промежуточных данных и некоторых констант.

long JDI(int Y,int M,int D) {

long q,j;

j=(M-14)/12;

q=Y+j+4800;

return D-32075L+1461*q/4+367L*(M-2-12*j)/12-3*((q+100)/100) /4; }

Численный эксперимент показал, что формулы алгоритма JDI справедливы только для дат позднее 15.10.1582. В соответствующих оригинальных публикациях это ограничение не приводится. Возможно, что на практике большинству из нас и не придется обрабатывать более ранние даты, однако оговорка о сфере применимости алгоритма представляется нам обязательной.

Алгоритм JD2




Пусть григорианская дата представлена в виде двух целых чисел у (номер года, который может быть как положительным, так и отрицательным для дат до но-



вой эры), м (номер месяца — число от 1 до 12) и вещественного числа от = D.T (D — номер дня в месяце, т — часть текущего дня от 0,00000 до 0,99999, прошедшая от полуночи). Единственная тонкость в формулах Меёса заключается в том, что используемая им функция int означает выделение целой части без какого-либо округления в большую или меньшую сторону.

Если м > 2, то положим y = Y и m = M, в противном случае у = Y - 1 и m = м + 12. Если григорианская дата приходится на момент после 15.10.1582, то вычисляются:

А = int(у/100)

В = 2 - А + int(А/4)

Если заданная дата предшествует моменту принятия григорианского календаря, то следует положить в = о. Для правильной обработки отрицательных номеров года следует вычислить:

С = int(365.25*у) при у > 0

С = int(365.25 * у - 0.75) При у < 0

Окончательная формула для нахождения JD имеет вид:

JD = С + int (30. 6001 * (m+D) + DT + 1720994.5 + В

Численные эксперименты показали, что функция JD2 выдает правильные результаты на всем интервале дат, начиная с 1.01.4713 до н. э. (то есть от Y = -4712, м = 1, от = 1.5) и до наших дней. Ее работа была проверена нами в цикле для 12 часов полудня каждого дня начального года. А затем — также в цикле по первому дню каждого последующего года с учетом смены обычных и високосных лет.

Алгоритм JD3

Алгоритм JD3, указанный в предисловии редактором перевода книги Меёса, привлекает своей простотой. В нем нет никаких логических проверок и реализующая его функция на языке Си имеет вид:

double JD3(int Y,int M,double DT) {

return 367.0*Y-floor(7.0*(Y+floor((M+9.)/12.))/4.)+

floor(275.0*M/9.)+DT+1721013.5; }

Однако первый же эксперимент с вычислением даты JD, приходящейся на 101,1600 (JD3 = 2305445.0), привел к расхождению с результатом Меёса (JD2 = = 2305448.0) на 3 дня. Более тщательный эксперимент показал, что функция JD3 начинает выдавать правильные результаты с 1.03.1900. А заключительной датой, до которой значения JD3 совпадают с JD2, является 29.02.2100.




Содержание раздела