ldpk
ldpk_power_ct.h
1 #ifndef ldpk_power_ct_sdv
2 #define ldpk_power_ct_sdv
3 
4 namespace ldpk
5  {
6 // Position des hoechsten gesetzten Bits in N.
7 // Das ist eine Art Zweierlogarithmus von N.
8 //
10  template <int N> class highest_bit_ct
11  {
12  public:
13  const static int r = highest_bit_ct< (N >> 1) >::r + 1;
14  };
15 // Das ist der niedrigste Wert, fuer den die Operation definiert ist.
16 // Was wir bei Null machen, entscheiden wir spaeter.
17  template <> class highest_bit_ct<1>
18  {
19  public:
20  const static int r = 0;
21  };
22 
23 // Berechnung der Potenzen 0 bis N-1 einer T-wertigen Zahl,
24 // wobei N eine CT-Konstante ist. Hierfuer werden N - 2
25 // RT-Multiplikationen benoetigt. Fuer das n-te Monom werden
26 // ceil(log2(n)) Multiplikationen verwendet, um die Genauigkeit
27 // zu optimieren. Der Sinn der Uebung besteht darin, eine Polynomauswertung
28 // zu bauen, die nicht ungenauer ist als Clenshaw (allerdings etwas langsamer),
29 // aber moeglicherweise einfacher, weil man keine Chebyshev-Entwicklung benoetigt.
30 //
32  template <class T,int N>
33  class power_ct
34  {
35  public:
36  void build(T x,T* p)
37  {
38  power_ct<T,N - 1>().build(x,p);
39  p[N - 1] = p[1 << (highest_bit_ct<N - 1>::r - 1)] * p[N - 1 - (1 << (highest_bit_ct<N - 1>::r - 1))];
40  }
41  };
42  template <class T>
43  class power_ct<T,1>
44  {
45  public:
46  void build(T x,T* p)
47  {
48  p[0] = T(1);
49  }
50  };
51  template <class T>
52  class power_ct<T,2>
53  {
54  public:
55  void build(T x,T* p)
56  {
57  p[0] = T(1);
58  p[1] = x;
59  }
60  };
61  }
62 
63 #endif
Compile-Time computations, needed by ldpk::power_ct.
Definition: ldpk_power_ct.h:10
The namespace of (most of the) things related to the Lens Distortion Plugin Kit.
Definition: ldpk.h:19
Computing N powers of a given number, where N is a compile-time constant.
Definition: ldpk_power_ct.h:33