tlx
power_to_the.hpp
Go to the documentation of this file.
1 /*******************************************************************************
2  * tlx/math/power_to_the.hpp
3  *
4  * power_to_the<D>(x) raises x to the D-th power using log(D) unrolled
5  * multiplications.
6  *
7  * Part of tlx - http://panthema.net/tlx
8  *
9  * Copyright (C) 2019 Manuel Penschuck <tlx@manuel.jetzt>
10  *
11  * All rights reserved. Published under the Boost Software License, Version 1.0
12  ******************************************************************************/
13 
14 #ifndef TLX_MATH_POWER_TO_THE_HEADER
15 #define TLX_MATH_POWER_TO_THE_HEADER
16 
17 #include <tlx/math/div_ceil.hpp>
18 
19 namespace tlx {
20 
21 //! \addtogroup tlx_math
22 //! \{
23 
24 /******************************************************************************/
25 //! power_to_the<D>(x)
26 
27 //! returns x raised to the power of D using log(D) explicit multiplications.
28 template <unsigned D, typename T>
29 static inline constexpr
30 T power_to_the(T x) {
31  // Compiler optimize two calls to the same recursion into one
32  // Tested with GCC 4+, Clang 3+, MSVC 15+
33  return D < 1 ? 1
34  : D == 1 ? x
35  : power_to_the<D / 2>(x) * power_to_the<div_ceil(D, 2)>(x);
36 }
37 
38 //! \}
39 
40 } // namespace tlx
41 
42 #endif // !TLX_MATH_POWER_TO_THE_HEADER
43 
44 /******************************************************************************/
static constexpr T power_to_the(T x)
power_to_the<D>(x)
static constexpr auto div_ceil(const IntegralN &n, const IntegralK &k) -> decltype(n+k)
calculate n div k with rounding up, for n and k positive!
Definition: div_ceil.hpp:25