]> www.ginac.de Git - cln.git/blob - src/float/lfloat/misc/cl_LF_leninc.cc
Use paths relative the `src' directory in the #include directives.
[cln.git] / src / float / lfloat / misc / cl_LF_leninc.cc
1 // cl_LF_len_incsqrt().
2
3 // General includes.
4 #include "base/cl_sysdep.h"
5
6 // Specification.
7 #include "float/lfloat/cl_LF.h"
8
9
10 // Implementation.
11
12 namespace cln {
13
14 uintC cl_LF_len_incsqrt (uintC n)
15 {
16 // Methode bei intDsize=16:
17 // n -> n+1 für n<=12 wegen 16n+sqrt(16n)+2 < 16(n+1)
18 // n -> n+2 für n<=56 wegen 16n+sqrt(16n)+2 < 16(n+2)
19 // n -> n+4 für n<=240
20 // n -> n+8 für n<=992
21 // n -> n+16 für n<=4032
22 // n -> n+32 für n<=16256
23 // n -> n+65 für n<=65535
24 // Allgemein: intDsize*n + sqrt(intDsize*n) + 2 < intDsize*(n+inc)
25 // <==>       sqrt(intDsize*n) + 2 < intDsize*inc
26 // <==>       sqrt(intDsize*n) < intDsize*inc - 2
27 // <==>       intDsize*n < intDsize^2*inc^2 - 4*intDsize*inc + 4
28 // <==>       n <= intDsize*inc^2 - 4*inc
29         return
30           #define NMAX(k)  (uintC)((intDsize*(k)-4)*(k))
31           #define FITS(n,k)  ((n) <= NMAX(k))
32           #define n_max  (uintC)(bitm(intCsize)-1)
33           #define TRYINC(inc)  FITS(n_max,inc) || FITS(n,inc) ? RETINC(inc) :
34           #define RETINC(inc)  \
35             /* at this point we know  n <= NMAX(inc) */                 \
36             /* Check whether n + (inc) overflows. */                    \
37           ((NMAX(inc) <= n_max-(inc)) || (n <= n_max-(inc)) ? n+(inc) : n_max)
38           #define TEST(i)  TRYINC(1UL<<i)
39           TEST(0)
40           TEST(1)
41           TEST(2)
42           TEST(3)
43           TEST(4)
44           TEST(5)
45           TEST(6)
46           TEST(7)
47           TEST(8)
48           TEST(9)
49           TEST(10)
50           TEST(11)
51           TEST(12)
52           TEST(13)
53           // No TEST(14), because NMAX(1UL<<14) is already out of range.
54           n_max;
55 }
56
57 }  // namespace cln