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.