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