int qyn( qn, x, y )
QELT qn[], x[], y[];
{ long i, k, n, sign, kpn; volatiledouble du, dn; union
{ unsignedshort s[4]; double d;
} dz; #if ERRCK
QELT bt;
bt = 0; #endif
qfloor( qn, h ); if( qcmp(qn, h) != 0 )
{ /* y = (cos(PI*v) * jv( v, x ) - jv( -v, x ))/sin(PI*v); */
qjn( qn, x, g );
qmul( qpi, qn, a );
qcos( a, f );
qmul( f, g, g );
qmov( qn, f );
qneg( f );
qjn( f, x, h );
qsub( h, g, g );
qsin( a, f );
qdiv( f, g, y ); return0;
}
qtoe( qn, dz.s );
dn = dz.d;
n = dn; if( n < 0 )
{
n = -n; if( (n & 1) == 0 ) /* -1**n */
sign = 1; else
sign = -1;
} else
sign = 1;
/* Use forward recurrence from order k to order n *Theasymptoticexpansionwouldworkfornonintegern *aslongasn-kisaninteger.
*/ int qynrecur( k, n, x, y ) long k, n;
QELT x[], y[];
{
QELT r[NQ], anm1[NQ], anm2[NQ], g[NQ], h[NQ];
/* Calculate Y_k(x), Y_k+1(x) for relatively small k */
ltoq( &k, r );
qhank( r, x, g );
qmul( hankpp, hanks, g );
qmul( hankqq, hankc, h );
qadd( g, h, anm2 );
qmul( hankzz, anm2, anm2 );
qadd( qone, r, r );
k += 1;
qhank( r, x, g );
qmul( hankpp, hanks, g );
qmul( hankqq, hankc, h );
qadd( g, h, anm1 );
qmul( hankzz, anm1, anm1 );
qmul( qtwo, r, r ); /* r = 2 * k; */ /* Y_k+1 = 2k/x Y_k - Y_k-1 */ do
{
qmul( anm1, r, g ); /* an = r * anm1 / x - anm2; */
qdiv( x, g, g );
qsub( anm2, g, g );
qmov( anm1, anm2 ); /* anm2 = anm1; */
qmov( g, anm1 ); /* anm1 = an; */
qadd( qtwo, r, r ); /* r += 2.0; */
} while( ++k < n );
qmov( g, y ); return0;
}
#if AUXFUN /* auxiliary function for y0 approximation */
int qyaux0( x, y )
QELT *x, *y;
{
QELT a[NQ], c[NQ];
if( x[1] < 2 ) /* arg == 0 then ans = 2/pi * ( Eul + ln(0.5) ) */
{
qmov( qone, a );
a[1] -= 1;
qlog( a, a );
qadd( qeul, a, a );
a[1] += 1;
qdiv( qpi, a, y ); return(0);
}
/* else ans = y0(x) - 2/pi * ln(x) * j0(x) */
qclear( a );
qyn( a, x, yn );
qclear( a ); /*qjn( a, x, a );*/
qlog( x, c );
qmul( jn, c, c );
c[1] += 1;
qdiv( qpi, c, c );
qsub( c, yn, y ); return(0);
}
/* auxiliary function for y1 approximation */
int qyaux1( x, y )
QELT x[], y[];
{
QELT a[NQ], c[NQ];
if( x[1] < 2 ) /* arg == 0 then ans = 0 */
{
qclear( y ); return(0);
}
/* else ans = y1(x) - 2/pi * ( ln(x) * j1(x) - 1/x ) */
qmov( qone, a );
qyn( a, x, yn ); /* qmov(qone,a); qjn(a,x,a);
*/
qlog( x, c );
qmul( jn, c, c );
qdiv( x, qone, a ); /* 1/x */
qsub( a, c, c );
c[1] += 1;
qdiv( qpi, c, c ); /* * 2 / pi */
qsub( c, yn, y ); return(0);
}
/* asymptotic expansion *AMS55#9.2.28
*/
qmul( qn, qn, m ); /* m = 4.0*n*n;*/
m[1] += 2;
qclear( j ); /* j = 0.0;*/
qmov( qone, k ); /* k = -1.0;*/
qneg( k );
qmul( qx, qx, z ); /* z = (2x)**2*/
z[1] += 2;
qmov( qone, u ); /* u = 1.0 */
qmov( qone, ans ); /* ans = 1.0;*/
min = MAXEXP;
while( ((int) qone[1] - (int) u[1]) < NBITS/2 )
{
qadd( qtwo, k, k ); /* k += 2.0;*/
qadd( qtwo, j, j ); /* j += 2.0;*/
qmuli( k, k, t ); /* u *= k * (m - k * k)/(j * z);*/
qsub( t, m, t );
qmuli( k, t, t );
qmul( t, u, u );
qmuli( j, z, t );
qdiv( t, u, u );
qadd( u, ans, ans );
term = u[1]; if( term >= min )
{
printf( "qjmod converges to %d bits\n", qone[1] - term ); goto adone;
}
min = term;
}
adone:
qmul( qx, qpi, t );
qdiv( t, ans, ans );
ans[1] += 1;
qmov( ans, qy );
fdone: ; return0;
}
#endif/* AUXFUN */
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.12 Sekunden
(vorverarbeitet am 2026-06-23)
¤
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.