1 // cl_LF_len_incsqrt().
4 #include "base/cl_sysdep.h"
7 #include "float/lfloat/cl_LF.h"
14 uintC cl_LF_len_incsqrt (uintC n)
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
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) :
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)
53 // No TEST(14), because NMAX(1UL<<14) is already out of range.