public static double AiryB(double x)
{
double z, zz, t, f, g, uf, ug, k, zeta, theta;
if (x > MAXAIRY)
return Double.PositiveInfinity;
if (x < -2.09)
{
t = Math.Sqrt(-x);
zeta = -2.0 * x * t / 3.0;
t = Math.Sqrt(t);
k = SQPII / t;
z = 1.0 / zeta;
zz = z * z;
uf = 1.0 + zz * polevl(zz, AFN, 8) / p1evl(zz, AFD, 9);
ug = z * polevl(zz, AGN, 10) / p1evl(zz, AGD, 10);
theta = zeta + 0.25 * Math.PI;
f = Math.Sin(theta);
g = Math.Cos(theta);
return k * (g * uf + f * ug);
}
if (x > 8.3203353)
{
t = Math.Sqrt(x);
zeta = 2.0 * x * t / 3.0;
g = Math.Exp(zeta);
t = Math.Sqrt(t);
z = 1.0 / zeta;
f = z * polevl(z, BN16, 4) / p1evl(z, BD16, 5);
k = SQPII * g;
return k * (1.0 + f) / t;
}
f = 1.0;
g = x;
t = 1.0;
uf = 1.0;
ug = x;
k = 1.0;
z = x * x * x;
while (t > MACHEP)
{
uf *= z;
k += 1.0;
uf /= k;
ug *= z;
k += 1.0;
ug /= k;
uf /= k;
f += uf;
k += 1.0;
ug /= k;
g += ug;
t = Math.Abs(uf / f);
}
uf = AIRY_C1 * f;
ug = AIRY_C2 * g;
return SQRT3 * (uf + ug);
}