почему-то скачет возраст луны. То показывает возраст 7.35 дней...а через минуту уже 7.79.
Предлагаю разобраться в коде Src/CalcEphem.c:CalcEphem()...
Забавные такие глюки... Отключил всё, рисует только локальное время и 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
<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: а иначе получается на полдня больше
<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: диагноз - на переписывание :) Код неподдерживаемый в принципе
Как уже отмечено здесь fabs(cx-bx)==fabs(bx-ax) но численно это не так. Т.е. если оставить x2 = bx; x1 = bx - C*(bx-ax); скачки прекратятся. В целом же эту программу нужно проверять на соответсвие агоритма и точности вычислений. Расчет различных характеристик Луны, эфемерид и пр. обычно производится по приближенным формулам. Иногда там излишняя точность может оказаться даже вредной.
Фтопку. Я уже качаю "Astronomical Algorythms", плюс нашёл http://www.fourmilab.ch/moontoolw/ с сорцами и лицензией "You're welcome to use this source code in any way you like". Код на пару порядков понятнее.
Программа moontoolw выдает возраст луны, не соответствующий другим источникам в интернете. Данные примерно соответствуют параметру AGE в CalcEphem.c:CalcEphem.
raorn: Segmentation fault (core dumped) Как нибудь потом...
В 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/
(In reply to comment #9) > В Net/OpenBSD есть такая программка pom (Phase Of Moon). Только возраст она не считает...
(In reply to comment #10) > (In reply to comment #9) > > В Net/OpenBSD есть такая программка pom (Phase Of Moon). > Только возраст она не считает... /me hides
Наступило ли "потом"? :)
Не наступило. У меня мозг взрывается от этой математики.