public static double Y0(double x)
{
if (x < 8.0)
{
double y = x*x;
double ans1 = -2957821389.0 + y*(7062834065.0 + y*(-512359803.6
+ y*(10879881.29 + y*(-86327.92757 + y*228.4622733))));
double ans2 = 40076544269.0 + y*(745249964.8 + y*(7189466.438
+ y*(47447.26470 + y*(226.1030244 + y*1.0))));
return (ans1 / ans2) + 0.636619772 * J0(x) * Math.Log(x);
}
else
{
double z = 8.0/x;
double y = z*z;
double xx = x - 0.785398164;
double ans1 = 1.0 + y*(-0.1098628627e-2 + y*(0.2734510407e-4
+ y*(-0.2073370639e-5 + y*0.2093887211e-6)));
double ans2 = -0.1562499995e-1 + y*(0.1430488765e-3
+ y*(-0.6911147651e-5 + y*(0.7621095161e-6
+ y*(-0.934945152e-7))));
return Math.Sqrt(0.636619772 / x) *
(Math.Sin(xx) * ans1 + z * Math.Cos(xx) * ans2);
}
}