]> www.ginac.de Git - cln.git/blob - src/integer/conv/cl_I_digits_need.cc
8ffe13a668e376350131aec60a1778c3c7550022
[cln.git] / src / integer / conv / cl_I_digits_need.cc
1 // cl_digits_need().
2
3 // General includes.
4 #include "cl_sysdep.h"
5
6 // Specification.
7 #include "cl_I.h"
8
9
10 // Implementation.
11
12 uintL cl_digits_need (const cl_I& x, uintL base)
13 {
14   if (fixnump(x))
15     { return cl_value_len; } // x < 2^cl_value_len, base >= 2, also reicht das
16   else
17     { var uintC len = TheBignum(x)->length;
18       // 1+ceiling(len * intDsize*log(2)/log(base)) Bytes oder etwas mehr
19       var uintL need = 1+floor(len,1024/intDsize); // > ceiling(len*intDsize/1024) >= 0
20       switch (base) // need mit ceiling(1024*log(2)/log(base)) multiplizieren:
21         { case 2: need = 1024*need; break;
22           case 3: need = 647*need; break;
23           case 4: need = 512*need; break;
24           case 5: need = 442*need; break;
25           case 6: need = 397*need; break;
26           case 7: need = 365*need; break;
27           case 8: need = 342*need; break;
28           case 9: need = 324*need; break;
29           case 10: need = 309*need; break;
30           case 11: need = 297*need; break;
31           case 12: need = 286*need; break;
32           case 13: need = 277*need; break;
33           case 14: need = 269*need; break;
34           case 15: need = 263*need; break;
35           case 16: need = 256*need; break;
36           case 17: need = 251*need; break;
37           case 18: need = 246*need; break;
38           case 19: need = 242*need; break;
39           case 20: need = 237*need; break;
40           case 21: need = 234*need; break;
41           case 22: need = 230*need; break;
42           case 23: need = 227*need; break;
43           case 24: need = 224*need; break;
44           case 25: need = 221*need; break;
45           case 26: need = 218*need; break;
46           case 27: need = 216*need; break;
47           case 28: need = 214*need; break;
48           case 29: need = 211*need; break;
49           case 30: need = 209*need; break;
50           case 31: need = 207*need; break;
51           case 32: need = 205*need; break;
52           case 33: need = 203*need; break;
53           case 34: need = 202*need; break;
54           case 35: need = 200*need; break;
55           case 36: need = 199*need; break;
56           default: NOTREACHED
57         }
58       // Nun gilt need >= len*intDsize*log(2)/log(base).
59       need += 1; // Platzbedarf in Bytes
60       return need;
61     }
62 }