26 #ifndef MLN_METAL_MATH_ROOT_HH
27 # define MLN_METAL_MATH_ROOT_HH
36 # include <mln/metal/math/pow.hh>
39 # define mlc_root(N,X) mln::metal::math::root<( N ),( X )>
54 template <
unsigned n,
unsigned x,
55 unsigned lo = 1,
unsigned hi = x>
59 mid = (lo + hi + 1) / 2,
60 val_lo = root<n, x, lo, mid-1>::value,
61 val_hi = root<n, x, mid, hi>::value
63 enum {
value = x < mlc_pow_int(mid, n) ? val_lo : val_hi };
66 template<
unsigned n,
unsigned x,
unsigned m>
67 struct root<n, x, m, m>
74 template <
unsigned n,
unsigned x>
75 struct root : bool_<(n != 0)>::check_t
77 enum {
value = impl::root<n,x>::value,
78 reminder = x - mlc_pow_int(value, n) };
82 struct root<n, 0> : bool_<(n != 0)>::check_t
95 #endif // ! MLN_METAL_MATH_ROOT_HH