Bug 8187

Summary: Скачет возраст луны.
Product: Sisyphus Reporter: stalker <stalker>
Component: wmMoonClockAssignee: pav <pav>
Status: CLOSED WONTFIX QA Contact: qa-sisyphus
Severity: normal    
Priority: P2 CC: damir, pav, php-coder
Version: unstable   
Hardware: all   
OS: Linux   

Description stalker 2005-10-11 10:08:34 MSD
почему-то скачет возраст луны. То показывает возраст 7.35 дней...а через минуту 
уже 7.79.
Comment 1 Sir Raorn 2005-10-11 10:25:32 MSD
Предлагаю разобраться в коде Src/CalcEphem.c:CalcEphem()...
Comment 2 Sir Raorn 2005-10-11 10:57:55 MSD
Забавные такие глюки...  Отключил всё, рисует только локальное время и Age
(примерно два раза в секунду):

$ ./wmMoonClock -lat 55 -lon -37
2005.10.11 10:55:54 --  7.85
2005.10.11 10:55:55 --  7.85
2005.10.11 10:55:55 --  7.85
2005.10.11 10:55:56 --  7.85
2005.10.11 10:55:56 --  7.85
2005.10.11 10:55:57 --  8.32
2005.10.11 10:55:58 --  8.32
2005.10.11 10:55:58 --  8.32
2005.10.11 10:55:59 --  8.32
2005.10.11 10:56:00 --  7.85
2005.10.11 10:56:00 --  7.85
2005.10.11 10:56:01 --  7.85
2005.10.11 10:56:01 --  7.85
2005.10.11 10:56:02 --  8.32
2005.10.11 10:56:03 --  7.85
2005.10.11 10:56:03 --  7.85
2005.10.11 10:56:04 --  8.32
2005.10.11 10:56:05 --  7.85
2005.10.11 10:56:05 --  7.85
2005.10.11 10:56:06 --  8.32
2005.10.11 10:56:06 --  8.32
2005.10.11 10:56:07 --  8.32
2005.10.11 10:56:08 --  8.32
2005.10.11 10:56:08 --  8.32
2005.10.11 10:56:09 --  8.32
2005.10.11 10:56:10 --  8.32
2005.10.11 10:56:10 --  8.32
2005.10.11 10:56:11 --  8.32
2005.10.11 10:56:11 --  8.32
2005.10.11 10:56:12 --  8.32
2005.10.11 10:56:13 --  8.32
2005.10.11 10:56:13 --  8.32
2005.10.11 10:56:14 --  8.32
2005.10.11 10:56:15 --  8.32
2005.10.11 10:56:15 --  8.32
2005.10.11 10:56:16 --  8.32
2005.10.11 10:56:16 --  8.32
2005.10.11 10:56:17 --  8.32
2005.10.11 10:56:18 --  8.32
2005.10.11 10:56:18 --  8.32
2005.10.11 10:56:19 --  8.32
2005.10.11 10:56:20 --  7.85
2005.10.11 10:56:20 --  7.85
2005.10.11 10:56:21 --  7.85
2005.10.11 10:56:21 --  7.85
2005.10.11 10:56:22 --  8.32
2005.10.11 10:56:23 --  7.85
2005.10.11 10:56:23 --  7.85
2005.10.11 10:56:24 --  7.85
2005.10.11 10:56:25 --  7.85
2005.10.11 10:56:25 --  7.85
2005.10.11 10:56:26 --  8.32
2005.10.11 10:56:27 --  8.32
2005.10.11 10:56:27 --  8.32
Comment 3 Sir Raorn 2005-10-11 17:37:15 MSD
<Lost_work> raorn: я кажись нашел в чем может быть дело
<raorn> Lost_work: да?
<Lost_work> raorn: if (fabs(cx-bx) > fabs(bx-ax)){
<Lost_work> raorn: сравнение двух флоатов
<Lost_work> raorn: оно должно с дельтой идти
<Lost_work> raorn: вызов такой: NewMoon(Ta, Tb, Tc) где Tb вычислается, а Ta,Tc
= Tb +/- const
<Lost_work> raorn: поэтому cx-bx = bx-ax
<raorn> Lost_work: там любое > 0 должно быть
<Lost_work> raorn: поэтому дельту надо вводить.
<Lost_work> raorn: ща введу и посмотрю
<Lost_work> raorn: скакать перестало
<Lost_work> raorn: зато возраст показывает 8.6
<Lost_work> а реально 8.1
<Lost_work> raorn:  если сделать так:  if (fabs(cx-bx) - fabs(bx-ax) > -1E-10){
то вроде совпадает с тем, что сталкер приводил
<Lost_work> raorn: но это соответствует >=, а не >
<Lost_work> raorn: а иначе получается на полдня больше
Comment 4 Sir Raorn 2005-10-11 18:27:15 MSD
<raorn> Lost_work: в общем я перебираю время посекундно и ищу скачки...
<Lost_work> raorn: да не будет их :)
<raorn> Lost_work: будут
<raorn> Lost_work: один уже нашёл
<raorn>         if (fabs(val - last_val) > .0001) {
<raorn> Lost_work: я уже на MoonAge смотрю
<raorn> Lost_work: смотри:
<raorn> ,--8<-
<raorn> |2005.10.11 18:39:16 --  8.174033 -- 8.173933
<raorn> |2005.10.11 18:41:09 --  8.175341 -- 8.175284
<raorn> |2005.10.11 18:42:18 --  8.176139 -- 8.176040
<raorn> |2005.10.11 18:44:10 --  8.177435 -- 8.177336
<raorn> `-->8-
<raorn> Lost_work: как разница возраста между текущей и предыдущей секундой
может быть отрицательная?
<Lost_work> raorn: а что за цифры то?
<raorn> Lost_work: age в днях
<Lost_work> raorn: я понял, почему их две?
<raorn> Lost_work: слева - предыдущая секунда, справа соотвеццтвует дате
<Lost_work> raorn: хз :(( опять шутки округления где-то
<raorn> ,--8<-
<raorn> |2005.10.11 18:01:57 --  0.000000 -- 8.148097
<raorn> |2005.10.12 10:46:40 --  8.845838 -- 9.398525
<raorn> |2005.10.28 18:24:26 --  25.716407 -- 25.163743
<raorn> |2005.10.28 18:27:08 --  25.165496 -- 25.165619
<raorn> |2005.10.28 18:28:49 --  25.166665 -- 25.166787
<raorn> |2005.10.28 18:31:31 --  25.168540 -- 25.168663
<raorn> |2005.10.28 18:33:12 --  25.169709 -- 25.169831
<raorn> `-->8-
<raorn> Lost_work: и так далее
<raorn> ,--8<-
<raorn> |25.163743-25.716407
<raorn> |-.552664
<raorn> `-->8-
<raorn> ,--8<-
<raorn> |25.169831-25.169709
<raorn> |.000122
<raorn> `-->8-
<Lost_work> raorn: диагноз - на переписывание :) Код неподдерживаемый в принципе
Comment 5 Valery Pipin 2005-10-12 08:12:38 MSD
Как уже отмечено здесь fabs(cx-bx)==fabs(bx-ax) 
но численно это не так. Т.е. если оставить 
      x2 = bx; 
      x1 = bx - C*(bx-ax); 
скачки прекратятся.  
В целом же эту программу нужно проверять на соответсвие агоритма  
и точности вычислений. Расчет различных характеристик Луны, 
эфемерид и пр. обычно производится по приближенным формулам. 
Иногда там излишняя точность может оказаться даже вредной. 
 
Comment 6 Sir Raorn 2005-10-12 10:27:31 MSD
Фтопку.  Я уже качаю "Astronomical Algorythms", плюс нашёл
http://www.fourmilab.ch/moontoolw/ с сорцами и лицензией "You're welcome to use
this source code in any way you like".  Код на пару порядков понятнее.
Comment 7 Damir Shayhutdinov 2005-10-12 19:56:37 MSD
Программа moontoolw выдает возраст луны, не соответствующий другим источникам в 
интернете. Данные примерно соответствуют параметру AGE в CalcEphem.c:CalcEphem.
Comment 8 Sir Raorn 2006-01-28 13:18:03 MSK
raorn: Segmentation fault (core dumped)

Как нибудь потом...
Comment 9 Slava Semushin 2007-01-12 16:05:00 MSK
В Net/OpenBSD есть такая программка pom (Phase Of Moon). Там код должен быть
более понятный и комментарии есть:

http://cvsweb.netbsd.org/bsdweb.cgi/src/games/pom/
http://www.openbsd.org/cgi-bin/cvsweb/src/games/pom/
Comment 10 Sir Raorn 2007-01-12 16:19:36 MSK
(In reply to comment #9)
> В Net/OpenBSD есть такая программка pom (Phase Of Moon).

Только возраст она не считает...
Comment 11 Slava Semushin 2007-01-12 16:23:49 MSK
(In reply to comment #10)
> (In reply to comment #9)
> > В Net/OpenBSD есть такая программка pom (Phase Of Moon).
> Только возраст она не считает...

/me hides
Comment 12 Mikhail Gusarov 2008-02-16 00:44:05 MSK
Наступило ли "потом"? :)
Comment 13 Sir Raorn 2008-02-16 12:43:22 MSK
Не наступило.  У меня мозг взрывается от этой математики.