]> www.ginac.de Git - cln.git/blob - src/float/lfloat/misc/cl_LF_lenincx.cc
Initial revision
[cln.git] / src / float / lfloat / misc / cl_LF_lenincx.cc
1 // cl_LF_len_incsqrtx().
2
3 // General includes.
4 #include "cl_sysdep.h"
5
6 // Specification.
7 #include "cl_LF.h"
8
9
10 // Implementation.
11
12 uintC cl_LF_len_incsqrtx (uintC n)
13 {
14 // Methode bei intDsize=16:
15 // Allgemein: intDsize*n + sqrt(intDsize*n) + 2 + 31 < intDsize*(n+inc)
16 // <==>       sqrt(intDsize*n) + 33 < intDsize*inc
17 // <==>       sqrt(intDsize*n) < intDsize*inc - 33
18 // <==>       intDsize*n < intDsize^2*inc^2 - 66*intDsize*inc + 1089
19 // <==>       n <= intDsize*inc^2 - 66*inc + floor(1089/intDsize)
20         return
21           #define NMAX(k)  (uintL)((intDsize*(k)-66)*(k)+floor(1089,intDsize))
22           #define FITS(n,k)  ((intDsize*(k) > 33) && ((n) <= NMAX(k)))
23           #define n_max  (uintL)(bitm(intCsize)-1)
24           #define TRYINC(inc)  FITS(n_max,inc) || FITS(n,inc) ? RETINC(inc) :
25           #define RETINC(inc)  \
26             /* at this point we know  n <= NMAX(inc) */                 \
27             /* Check whether n + (inc) overflows. */                    \
28           ((NMAX(inc) <= n_max-(inc)) || (n <= n_max-(inc)) ? n+(inc) : n_max)
29           #define TEST(i)  TRYINC(1UL<<i)
30           TEST(0)
31           TEST(1)
32           TEST(2)
33           TEST(3)
34           TEST(4)
35           TEST(5)
36           TEST(6)
37           TEST(7)
38           TEST(8)
39           TEST(9)
40           TEST(10)
41           TEST(11)
42           TEST(12)
43           TEST(13)
44           // No TEST(14), because NMAX(1UL<<14) is already out of range.
45           n_max;
46 }