public static final void setMaximumPrecision(int p)
  {
    if(p == currMpipl)
       return;

    currMpipl = p;
    mpmcr=MPMCRX;
    mpird=1;
    
    mpipl = currMpipl; 
    mpiou = 56; 
    mpiep = 10 - mpipl; 
    mpwds = (int)((mpipl /  7.224719896) + 1);
    mp2 = mpwds + 2;
    mp21 = mp2 + 1;
    mpoud = mpiou; 
    mpnw = mpwds;
    //const MPSize DEFAULTSIZE = MPSize(int((mpipl / 7.224719896) + 4));
    
    // initializing mpuu1
    int n = mpnw+1;
    double t1, ti;
    int j, i;
    
    t1 = 0.75 * n;
    int m = (int)(CL2 * Math.log (t1) + 1.0 - MPRXX); // *cast*
    int mq = m + 2;
    int nq = (int)(Math.pow(2, mq)); // *cast*
    mpuu1 = new DComplex[nq];
    mpuu1[0] = new DComplex(mq,0);
    
    int ku = 1;
    int ln = 1;
    
    for(j = 1; j<= mq; j++)
    {
      t1 = PI / ln;      
      for (i = 0; i<= ln - 1; i++)
      {
        ti = i * t1;
        mpuu1[i+ku] = new DComplex(Math.cos (ti), Math.sin (ti));
      }
      
      ku +=  ln;
      ln *= 2;
    }
    
    // initializing mpuu2
    double tpn;
    int k;
    
    t1 = 0.75 * n;
    mpuu2 = new DComplex [mq+nq];
    
    ku = mq + 1;
    mpuu2[0] = new DComplex(mq,0);
    
    int mm, nn, mm1, mm2, nn1, nn2, iu;
    for (k = 2; k<= mq - 1; k++)
    {
      mpuu2[k-1] = new DComplex(ku,0);
      mm = k;
      nn = (int)(Math.pow(2, mm)); // *cast*
      mm1 = (mm + 1) / 2;
      mm2 = mm - mm1;
      nn1 = (int)(Math.pow(2, mm1)); // *cast*
      nn2 = (int)(Math.pow(2, mm2)); // *cast*
      tpn = 2.0 * PI / nn;
      
      for(j = 0; j<nn2; j++)
      {
        for(i = 0; i<nn1; i++)
        {
          iu = ku + i + j * nn1;
          t1 = tpn * i * j;
          mpuu2[iu-1] = new DComplex(Math.cos (t1), Math.sin (t1));
        }
      }
      ku += nn;
    }
    
  }