|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T m
Length: 4018 (0xfb2) Types: TextFile Names: »moontx.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987 └─⟦this⟧ »EUUGD18/General/Date/moontx.c«
# /* * Phase of the Moon Conversion. * * Synopsis * * char *moontxt(buffer, year, month, day) * char *buffer; -- Output goes here. * int year; -- Year 1979 = 1979 * int month; -- Month Jan. = 1 * int day; -- Day 1 = 1 * * The phase of the moon (in readable ascii) is written into the buffer, * followed by a null. The routine returns a pointer to the trailing null. * * External routines called: * * copyst (String copy routine) */ extern char *copyst(); /* String output routine */ static char *phasetxt[] = { "new", "waxing crescent", "in its first quarter", "waxing gibbous", "full", "waning gibbous", "in its last quarter", "waning crescent" }; static int day_year[] = { /* Days in year for each month */ -1, -1, 30, 58, 89, 119, 150, 180, 211, 241, 272, 303, 333 }; /* Note: Jan. 1 will equal zero */ char *moontxt(buffer, year, month, day) char *buffer; /* Where to put the text */ int year; /* Year, 1978 = 1978 */ int month; /* Month, Jan = 1 */ int day; /* Day, 1 = 1 */ /* * Output the phase of the moon for the given year, month, day. * The routine calculates the year's epact (the age of the moon on Jan 1.), * adds this to the number of days in the year, and calculates the phase * of the moon for this date. * * In the algorithm: * * diy Is the day of the year - 1 (i.e., Jan 1 is day 0). * * golden Is the number of the year in the Mentonic cycle, used to * determine the position of the calender moon. * * epact Is the age of the calender moon (in days) at the beginning * of the year. To calculate epact, two century-based * corrections are applied: * Gregorian: (3 * cent)/4 - 12 * is the number of years such as 1700, 1800 when * leap year was not held. * Clavian: (((8 * cent) + 5) / 25) - 5 * is a correction to the Mentonic cycle of about * 8 days evry 2500 years. Note that this will * overflow 16 bits in the year 409600. Beware. * * The algorithm is accurate for the Gregorian calender only. * * The magic numbers used in the phase calculation are as follows: * 29.5 The moon's period in days. * 177 29.5 scaled by 6 * 22 (29.5 / 8) scaled by 6 (this gets the phase) * 11 ((29.5 / 8) / 2) scaled by 6 * * Theoretically, this should yield a number in the range 0 .. 7. However, * two days per year, things don't work out too well. * * Epact is calculated by the algorithm given in Knuth vol. 1 (calculation * of Easter). See also the article on Calenders in the Encyclopaedia * Britannica and Knuth's algorithm in CACM April 1962, page 209. */ { int phase; /* Moon phase */ register int cent; /* Century number (1979 = 20) */ register int epact; /* Age of the moon on Jan. 1 */ register int diy; /* Day in the year */ int golden; /* Moon's golden number */ if (month < 0 || month > 12) month = 0; /* Just in case */ diy = day + day_year[month]; /* Day in the year */ if ((month > 2) && ((year % 4 == 0) && ((year % 400 == 0) || (year % 100 != 0)))) diy++; /* Leapyear fixup */ cent = (year / 100) + 1; /* Century number */ golden = (year % 19) + 1; /* Golden number */ epact = ((11 * golden) + 20 /* Golden number */ + (((8 * cent) + 5) / 25) - 5 /* 400 year cycle */ - (((3 * cent) / 4) - 12)) % 30;/* Leap year correction */ if (epact <= 0) epact += 30; /* Age range is 1 .. 30 */ if ((epact == 25 && golden > 11) || epact == 24) epact++; /* * Calculate the phase, using the magic numbers defined above. * Note that (phase and 7) is equivalent to (phase mod 8) and * is needed on two days per year (when the algorithm yields 8). */ phase = (((((diy + epact) * 6) + 11) % 177) / 22) & 7; return(copyst(buffer, phasetxt[phase])); }