/* approximation to inverse function */
d = 1.0L/(9.0L*a);
y = ( 1.0L - d - ndtril(y0) * sqrtl(d) );
x = a * y * y * y;
lgm = lgaml(a);
for( i=0; i<10; i++ )
{ if( x > x0 || x < x1 ) goto ihalve;
y = igamcl(a,x); if( y < yl || y > yh ) goto ihalve; if( y < y0 )
{
x0 = x;
yl = y;
} else
{
x1 = x;
yh = y;
} /* compute the derivative of the function at this point */
d = (a - 1.0L) * logl(x0) - x0 - lgm; if( d < -MAXLOGL ) goto ihalve;
d = -expl(d); /* compute the step to the next approximation of x */
d = (y - y0)/d;
x = x - d; if( i < 3 ) continue; if( fabsl(d/x) < dithresh ) goto done;
}
/* Resort to interval halving if Newton iteration did not converge. */
ihalve:
d = 0.0625L; if( x0 == MAXNUML )
{ if( x <= 0.0L )
x = 1.0L; while( x0 == MAXNUML )
{
x = (1.0L + d) * x;
y = igamcl( a, x ); if( y < y0 )
{
x0 = x;
yl = y; break;
}
d = d + d;
}
}
d = 0.5L;
dir = 0;
for( i=0; i<400; i++ )
{
x = x1 + d * (x0 - x1);
y = igamcl( a, x );
lgm = (x0 - x1)/(x1 + x0); if( fabsl(lgm) < dithresh ) break;
lgm = (y - y0)/y0; if( fabsl(lgm) < dithresh ) break; if( x <= 0.0L ) break; if( y > y0 )
{
x1 = x;
yh = y; if( dir < 0 )
{
dir = 0;
d = 0.5L;
} elseif( dir > 1 )
d = 0.5L * d + 0.5L; else
d = (y0 - yl)/(yh - yl);
dir += 1;
} else
{
x0 = x;
yl = y; if( dir > 0 )
{
dir = 0;
d = 0.5L;
} elseif( dir < -1 )
d = 0.5L * d; else
d = (y0 - yl)/(yh - yl);
dir -= 1;
}
} if( x == 0.0L )
mtherr( "igamil", UNDERFLOW );
done: return( x );
}
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.10 Sekunden
(vorverarbeitet am 2026-06-15)
¤
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.