/usr/share/doc/hp48cc/examples/astro.hpc is in hp48cc 1.3-4.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 | // astro.hpc -- Some astronomical algorithms -*- C -*-
// Convert an integer to a two-digit string.
// For example:
// twodigits(3) returns "03"
// twodigits(12) returns "12"
declare twodigits(x) {
if (x < 10)
"0" + \\\-\>STR(x);
else
\\\-\>STR(x);
}
// Convert degrees, minutes, seconds to degrees (fractional).
declare dms2d(d, m, s) {
d + (m + s / 60) / 60;
}
// Convert hours, minutes, seconds to degrees (fractional).
declare hms2d(h, m, s) {
(h + (m + s / 60) / 60) * 15;
}
// Format degrees to string.
// For example, d2s(10.5) returns "10°30'00""
declare d2s(x) : d(0), m(0), s(0) {
d = twodigits(IP(x));
x = 60*FP(x);
m = twodigits(IP(x));
x = 60*FP(x);
s = twodigits(RND(x, 0));
d + "\\^o" + m + "'" + s + CHR(34); // Return value
}
// Format hours to string.
// For example, h2s(9.25) returns "09h15m00s"
declare h2s(x) : h(0), m(0), s(0) {
h = twodigits(IP(x));
x = 60*FP(x);
m = twodigits(IP(x));
x = 60*FP(x);
s = twodigits(RND(x, 0));
h + "h" + m + "m" + s + "s"; // Return value
}
// Format degrees to string.
// For example, dms2s(10, 2, 5) returns "10°02'05""
declare dms2s(d, m, s) {
d2s(dms2d(d, m, s));
}
// Format hours to string.
// For example, hms2s(10, 2, 5) returns "10h02m05s"
declare hms2s(h, m, s) {
h2s(dms2d(h, m, s));
}
// Calculate the date of Easter Sunday in the Gregorian calendar
// (hence valid from the year 1583 on).
// Algorithm by Spencer Jones, General Astronomy, 1922.
// Returns:
// 1: number of the month (1 = January, 2 = February, ...)
// 2: day of that month upon which Easter Sunday falls
declare easter(year) : a(0), b(0), c(0), d(0), e(0), f(0), g(0), h(0),
j(0), k(0), l(0), m(0), n(0), p(0) {
a = year % 19;
b = IP(year / 100);
c = year % 100;
d = IP(b / 4);
e = b % 4;
f = IP((b + 8) / 25);
g = IP((b - f + 1) / 3);
h = (19*a + b - d - g + 15) % 30;
j = IP(c / 4);
k = c % 4;
l = (32 + 2*e + 2*j - h - k) % 7;
m = IP((a + 11*h + 22*l) / 451);
n = IP((h + l - 7*m + 114) / 31);
p = (h + l - 7*m + 114) % 31;
n; // Return month
p + 1; // Return day
}
// Calculate the date of Easter Sunday in the Julian calendar.
// Returns:
// 1: number of the month (1 = January, 2 = February, ...)
// 2: day of that month upon which Easter Sunday falls
declare jeaster(year) : a(0), b(0), c(0), d(0), e(0), f(0), g(0) {
a = year % 4;
b = year % 7;
c = year % 19;
d = (19*c + 15) % 30;
e = (2*a + 4*b - d + 34) % 7;
f = IP((d + e + 114) / 31);
g = (d + e + 114) % 31;
f; // Return month
g + 1; // Return day
}
|