double ellik(phi, m) double phi, m;
{ double a, b, c, e, temp, t, K; int d, mod, sign, npio2;
if (m == 0.0) return (phi);
a = 1.0 - m; if (a == 0.0) { if (fabs(phi) >= PIO2) {
mtherr("ellik", SING); return (MAXNUM);
} return (log(tan((PIO2 + phi) / 2.0)));
}
npio2 = floor(phi / PIO2); if (npio2 & 1)
npio2 += 1; if (npio2) {
K = ellpk(a);
phi = phi - npio2 * PIO2;
} else
K = 0.0; if (phi < 0.0) {
phi = -phi;
sign = -1;
} else
sign = 0;
b = sqrt(a);
t = tan(phi); if (fabs(t) > 10.0) { /* Transform the amplitude */
e = 1.0 / (b * t); /* ... but avoid multiple recursions. */ if (fabs(e) < 10.0) {
e = atan(e); if (npio2 == 0)
K = ellpk(a);
temp = K - ellik(e, m); goto done;
}
}
a = 1.0;
c = sqrt(m);
d = 1;
mod = 0;
while (fabs(c / a) > MACHEP) {
temp = b / a;
phi = phi + atan(t * temp) + mod * PI;
mod = (phi + PIO2) / PI;
t = t * (1.0 + temp) / (1.0 - temp * t * t);
c = (a - b) / 2.0;
temp = sqrt(a * b);
a = (a + b) / 2.0;
b = temp;
d += d;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.