// cl_digits_need().

// General includes.
#include "cl_sysdep.h"

// Specification.
#include "cl_I.h"


// Implementation.

uintL cl_digits_need (const cl_I& x, uintL base)
{
  if (fixnump(x))
    { return cl_value_len; } // x < 2^cl_value_len, base >= 2, also reicht das
  else
    { var uintC len = TheBignum(x)->length;
      // 1+ceiling(len * intDsize*log(2)/log(base)) Bytes oder etwas mehr
      var uintL need = 1+floor(len,1024/intDsize); // > ceiling(len*intDsize/1024) >= 0
      switch (base) // need mit ceiling(1024*log(2)/log(base)) multiplizieren:
        { case 2: need = 1024*need; break;
          case 3: need = 647*need; break;
          case 4: need = 512*need; break;
          case 5: need = 442*need; break;
          case 6: need = 397*need; break;
          case 7: need = 365*need; break;
          case 8: need = 342*need; break;
          case 9: need = 324*need; break;
          case 10: need = 309*need; break;
          case 11: need = 297*need; break;
          case 12: need = 286*need; break;
          case 13: need = 277*need; break;
          case 14: need = 269*need; break;
          case 15: need = 263*need; break;
          case 16: need = 256*need; break;
          case 17: need = 251*need; break;
          case 18: need = 246*need; break;
          case 19: need = 242*need; break;
          case 20: need = 237*need; break;
          case 21: need = 234*need; break;
          case 22: need = 230*need; break;
          case 23: need = 227*need; break;
          case 24: need = 224*need; break;
          case 25: need = 221*need; break;
          case 26: need = 218*need; break;
          case 27: need = 216*need; break;
          case 28: need = 214*need; break;
          case 29: need = 211*need; break;
          case 30: need = 209*need; break;
          case 31: need = 207*need; break;
          case 32: need = 205*need; break;
          case 33: need = 203*need; break;
          case 34: need = 202*need; break;
          case 35: need = 200*need; break;
          case 36: need = 199*need; break;
          default: NOTREACHED
        }
      // Nun gilt need >= len*intDsize*log(2)/log(base).
      need += 1; // Platzbedarf in Bytes
      return need;
    }
}
