static public double y0(double x) throws ArithmeticException {
  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);
  }
}

static public double y0 ( double x ) throws ArithmeticException { 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 ) ; } }
returns the bessel function of the second kind of order 0 of the argument .
