Документ взят из кэша поисковой машины. Адрес оригинального документа : http://www.astronomy.ru/forum/index.php/topic,6603.20.html
Дата изменения: Sun Apr 10 03:41:38 2016
Дата индексирования: Sun Apr 10 03:41:38 2016
Кодировка: Windows-1251

Поисковые слова: год високосный
JD - стр. 2 - Астрономия и компьютеры

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

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

Оффлайн ched

  • Первооткрыватель астероидов
  • *****
  • Сообщений: 2 742
  • Рейтинг: +30/-13
    • Skype - chestd
  • Награды Открытие комет, астероидов, сверхновых звезд, научно значимые исследования.
Re: JD
« Ответ #20 : 10.07.2005 [17:38:28] »
Спасибо большое. Буду разбираться.

Оффлайн ched

  • Первооткрыватель астероидов
  • *****
  • Сообщений: 2 742
  • Рейтинг: +30/-13
    • Skype - chestd
  • Награды Открытие комет, астероидов, сверхновых звезд, научно значимые исследования.
Re: JD
« Ответ #21 : 11.07.2005 [09: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.07.2005 [13: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.07.2005 [14:00:25] от hoarfrost »

hoarfrost

  • Гость
Re: JD
« Ответ #23 : 11.07.2005 [14: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

  • Гость