| Summary: | Скачет возраст луны. | ||
|---|---|---|---|
| Product: | Sisyphus | Reporter: | stalker <stalker> |
| Component: | wmMoonClock | Assignee: | 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
Предлагаю разобраться в коде 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 Наступило ли "потом"? :) Не наступило. У меня мозг взрывается от этой математики. |