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