here is my easy way to calculate moon phase
int moon_phase(int y, int m, int d)
{
/*
calculates the moon phase (0-7), accurate to 1 segment.
0 = > new moon.
4 => full moon.
*/
int c,e;
double jd;
int b;
if (m < 3) {
y--;
m += 12;
}
++m;
c = 365.25*y;
e = 30.6*m;
jd = c+e+d-694039.09; /* jd is total days elapsed */
jd /= 29.53; /* divide by the moon cycle (29.53 days) */
b = jd; /* int(jd) -> b, take integer part of jd */
jd -= b; /* subtract integer part to leave fractional part of original jd */
b = jd*8 + 0.5; /* scale fraction from 0-8 and round by adding 0.5 */
b = b & 7; /* 0 and 8 are the same so turn 8 into 0 */
return b;
}
i developed this algorithm using floating point rather than integer for use in
pocket calculators and only just managed to fit inside the fx-201p. an older,
but integer formula is the following:
here is a command line pc program that is more accurate than the above for reference.
and here's another program to calculate the instant of full moon