code: static double expint(int p, final double result[]) {
          //double x = M_E;
          final double xs[] = new double[2];
          final double as[] = new double[2];
          final double ys[] = new double[2];
          //split(x, xs);
          //xs[1] = (double)(2.7182818284590452353602874713526625L - xs[0]);
          //xs[0] = 2.71827697753906250000;
          //xs[1] = 4.85091998273542816811e-06;
          //xs[0] = Double.longBitsToDouble(0x4005bf0800000000L);
          //xs[1] = Double.longBitsToDouble(0x3ed458a2bb4a9b00L);
  
          /* E */
          xs[0] = 2.718281828459045;
          xs[1] = 1.4456468917292502E-16;
  
          split(1.0, ys);
  
          while (p > 0) {
              if ((p & 1) != 0) {
                  quadMult(ys, xs, as);
                  ys[0] = as[0]; ys[1] = as[1];
              }
  
              quadMult(xs, xs, as);
              xs[0] = as[0]; xs[1] = as[1];
  
              p >>= 1;
          }
  
          if (result != null) {
              result[0] = ys[0];
              result[1] = ys[1];
  
              resplit(result);
          }
  
          return ys[0] + ys[1];
      }
docs: Compute exp(p) for a integer p in extended precision.
  @param p integer whose exponential is requested
  @param result placeholder where to put the result in extended precision
  @return exp(p) in standard precision (equal to result[0] + result[1])