docs: public static double I(int n, double x) {
          if (n < 0)
              throw new IllegalArgumentException("the variable n out of range.");
          else if (n == 0)
              return I0(x);
          else if (n == 1)
              return I(x);
  
          if (x == 0.0)
              return 0.0;
  
          double ACC = 40.0;
          double BIGNO = 1.0e+10;
          double BIGNI = 1.0e-10;
  
          double tox = 2.0 / Math.abs(x);
          double bip = 0, ans = 0.0;
          double bi = 1.0;
  
          for (int j = 2 * (n + (int) Math.sqrt(ACC * n)); j > 0; j--) {
              double bim = bip + j * tox * bi;
              bip = bi;
              bi = bim;
  
              if (Math.abs(bi) > BIGNO) {
                  ans *= BIGNI;
                  bi *= BIGNI;
                  bip *= BIGNI;
              }
  
              if (j == n)
                  ans = bip;
          }
  
          ans *= I0(x) / bi;
          return x < 0.0 && n % 2 == 1 ? -ans : ans;
      }