26 #ifndef MLN_METAL_MATH_SQRT_HH
27 # define MLN_METAL_MATH_SQRT_HH
36 # include <mln/metal/bool.hh>
37 # include <mln/metal/int.hh>
40 # define mlc_sqrt_int(N) mln::metal::math::sqrt_int<( N )>::value
57 template <
int n,
int lo = 1,
int hi = n>
61 mid = (lo + hi + 1) / 2,
65 enum {
value = n < mid * mid ? val_lo : val_hi };
68 template<
int n,
int m>
69 struct sqrt_int_<n, m, m>
76 template <
int n,
bool b>
77 struct sqrt_int_if_ : sqrt_int_<n>
80 reminder_ = n - value_ * value_ };
85 struct sqrt_int_if_< n, false >
92 struct sqrt_int : impl::sqrt_int_if_< n, (n >= 0) >
103 struct sqrt< int_<n> >
116 #endif // ! MLN_METAL_MATH_SQRT_HH