Телескопы покупают здесь


A A A A Автор Тема: JD  (Прочитано 6099 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн ched

  • Первооткрыватель астероидов
  • *****
  • Сообщений: 2 751
  • Благодарностей: 18
    • Skype - chestd
  • Награды Открытие комет, астероидов, сверхновых звезд, научно значимые исследования.
    • Сообщения от ched
Re: JD
« Ответ #20 : 10 Июл 2005 [18:38:28] »
Спасибо большое. Буду разбираться.

Оффлайн ched

  • Первооткрыватель астероидов
  • *****
  • Сообщений: 2 751
  • Благодарностей: 18
    • Skype - chestd
  • Награды Открытие комет, астероидов, сверхновых звезд, научно значимые исследования.
    • Сообщения от ched
Re: JD
« Ответ #21 : 11 Июл 2005 [10:42:30] »
hoarfrost, ваши формулы неточны. Они вычисляют с большой погрешностью на несколько дней + откуда-то берутся дробные части дней (хотя полдень).

А вот раздобыл точную формулу для нашего времени (ф-ла приспособлена для MS Excel)

Цитата
=1721424.5-ЦЕЛОЕ((year-1)/100)+ЦЕЛОЕ((year-1)/400)+ЦЕЛОЕ(365.25*(year-1))+DaysInMonths+day+(hrs/24)+(min/1440)+(sec/86400)

hoarfrost

  • Гость
Re: JD
« Ответ #22 : 11 Июл 2005 [14:18:05] »
hoarfrost, ваши формулы неточны. Они вычисляют с большой погрешностью на несколько дней + откуда-то берутся дробные части дней (хотя полдень).

Добрый день!

А с чем сравнивали? (В качестве проверки я "гонял" их "по таблицам" и данные совпадали).

Цитата
А вот раздобыл точную формулу для нашего времени (ф-ла приспособлена для MS Excel)
Цитата
=1721424.5-ЦЕЛОЕ((year-1)/100)+ЦЕЛОЕ((year-1)/400)+ЦЕЛОЕ(365.25*(year-1))+DaysInMonths+day+(hrs/24)+(min/1440)+(sec/86400)

Стоп-стоп-стоп!!! Вы их куда вставляли? в Excel? ;D Они же C-шные! ;D

То есть, выражение вида
Цитата
(4712 + year)/4
всегда будет целым - потому при при делении на целое число 4 всегда будет целое число. Если вы их прямо "так" вставляли в Excel, то они, естественно, должны давать неправильный результат - там не так строго с типами данных, как в C/C++.

Попробуйте проверить их в C.

В-общем, давайте проверять. ;)


Обновление:
Со счётчиком на Astronet совпадает. С числами, приводимыми в качестве примера в Монтенбруке - тоже.

Вы пробовали получить эту формулу?
« Последнее редактирование: 11 Июл 2005 [15:00:25] от hoarfrost »

hoarfrost

  • Гость
Re: JD
« Ответ #23 : 11 Июл 2005 [15:36:30] »
Вот текст функции для C++:

double JD (int year, int month, int day, double hour)
{
   int BaseDaysInMonths[12] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
   int DaysInMonths;
    double Result;

   DaysInMonths = BaseDaysInMonths[month-1];

   if ((year%4 == 0 && year%100 != 0 || year%400 == 0) && month > 2)
   {
      DaysInMonths++;
   }

    if (year <= 0)
   {
        Result = -0.5 + static_cast<double>((4712 + year)*365 + (4712 + year)/4 + DaysInMonths + (day - 1)) + static_cast<double>(hour)/24.0;
   }
   else
   {
       if (static_cast<double>(year)*10000.0 + static_cast<double>(month)*100 + static_cast<double>(day) <= 15821004.0)
      {
         Result = -0.5 + static_cast<double>((4713 + year - 1)*365 + (4712 + year - 1)/4 + 1 + DaysInMonths + (day - 1)) + static_cast<double>(hour)/24.0;
      }
      else
      {
         Result = -0.5 + static_cast<double>((4713 + year - 1)*365 + (4712 + year - 1)/4 + 1 + DaysInMonths + (day - 1)) + static_cast<double>(hour)/24.0  - floor((year - 1 - 1500)/100) + floor((year - 1 - 1200)/400) - 10.0;
      }
   }
   

return Result;
}



Предлагаю протестировать любому желающему. ;) Только рад буду. :)

P.S. Страшные конструкции вида static_cast<double>("что-то") можно заменять на обычное (double)"что-то."

AN1440

  • Гость
Re: JD
« Ответ #24 : 16 Июл 2005 [17:52:21] »
- при исчислении дат используется нулевой год! Он стоит перед 1 г. н. э. и 1 г.до н. э. Сначала я не понимал, для чего он вообще понадобился, но когда начал выводить формулы

Не совсем так!
"Нулевой год" - чисто арифметический смысл имеет. Для употребления в формулах. То есть, -4, -3, -2, -1, 0, 1, 2, 3....
В переводе на обычный счет - нулевой год - это первый год до нашей эры. Таким образом, полученное по формуле значение -4712 равно 4713 году до н.э.
С високосными годами в этот период времени была некоторая неразбериха. Просто МЫ СЕЙЧАС считаем, что високосный год - каждый четвертый ( до 1582 года). Так же, как применяем юлианский календарь ко временам задолго до Юлий Цезаря, этот календарь установившего. Естесственно, нулевой в это число попадает.
Процедура на бейсике, которую здесь привел AN1440, работает для всего Юлианского периода - и до, и после 1582. А с бейсика Вы ее можете переложить на что угодно (оригинал у Анатолия был на Паскале).
--------
Вообще - юлианские дни - великолепное изобретение. Тов. Скалигеру памятник поставить надо из монокристаллического кремния!
В заключение еще раз привожу досовскую программку на бейсике - целиком и полностью основана на использовании юлианских дней:
« Последнее редактирование: 16 Июл 2005 [18:10:40] от AN1440 »

Оффлайн ched

  • Первооткрыватель астероидов
  • *****
  • Сообщений: 2 751
  • Благодарностей: 18
    • Skype - chestd
  • Награды Открытие комет, астероидов, сверхновых звезд, научно значимые исследования.
    • Сообщения от ched
Re: JD
« Ответ #25 : 16 Июл 2005 [18:14:42] »
В заключение еще раз привожу досовскую программку на бейсике - целиком и полностью основана на использовании юлианских дней:

Что-то я не нашел в вашей программе юлианские даты.

hoarfrost

  • Гость
Re: JD
« Ответ #26 : 16 Июл 2005 [19:26:47] »
- при исчислении дат используется нулевой год! Он стоит перед 1 г. н. э. и 1 г.до н. э. Сначала я не понимал, для чего он вообще понадобился, но когда начал выводить формулы

Не совсем так!
"Нулевой год" - чисто арифметический смысл имеет. Для употребления в формулах. То есть, -4, -3, -2, -1, 0, 1, 2, 3....
В переводе на обычный счет - нулевой год - это первый год до нашей эры. Таким образом, полученное по формуле значение -4712 равно 4713 году до н.э.
С високосными годами в этот период времени была некоторая неразбериха. Просто МЫ СЕЙЧАС считаем, что високосный год - каждый четвертый ( до 1582 года). Так же, как применяем юлианский календарь ко временам задолго до Юлий Цезаря, этот календарь установившего. Естесственно, нулевой в это число попадает.

Всё верно. Только чуть-чуть добавлю: Нулевой год имеет такой же арифметический смысл, как, например, и JD. Где он здорово помогает: ну, например, при учёте высокосных лет - вот 16, 12, 8, 4 годы н.э. високосные, а 3,2 и 1 г. н. э.? Нет, конечно. А 1 г. до н.э.? Ведь на его месте должен быть високосный! Вот поэтому столь логичным (по моему мнению) и было введение нулевого года. Поскольку в этом случае високосным годом должен быть не 5 г. до н. э. а -4 год. Что гораздо удобнее считать.

Вообще, как я понял, стоит говорить о двух записях дат - с минусом и без. С минусом (например -3188 год) - это запись с учётом нулевого года. А без минуса (3189 г. до н.э. соответственно) - как было принято раньше.

Ну и как уже было сказано выше, не стоит забывать в те времена даты считали совсем по другому. Т.е. все эти года и пр. уже наш, в определённой степени "произвол".

-> Дирл
Цитата
Что-то я не нашел в вашей программе юлианские даты.
Лично у меня она находится внизу, и выводится тёмно зелёным цветом: "JD = .......".

AN1440

  • Гость
Re: JD
« Ответ #27 : 20 Июл 2005 [18:35:01] »
Там ВСЕ расчеты - и календари, и время, и фазы луны, и восходзаходы солнца - ВСЁ основано на использовании юлианских дней.
« Последнее редактирование: 20 Июл 2005 [18:41:34] от AN1440 »

hoarfrost

  • Гость
Re: JD
« Ответ #28 : 21 Июл 2005 [21:18:55] »
Там ВСЕ расчеты - и календари, и время, и фазы луны, и восходзаходы солнца - ВСЁ основано на использовании юлианских дней.

Вторая прога мне тоже понравилась! ;D