Square Root computation
// The recursion proceeds using a binary search technique
// (often called method of bisection). Inside the template,
// we compute if the result is in the first or second half
// of the range between LO and HI. This case differentiation
// is done using the conditional operator ?:. if mid^2 is
// greater than N, we continue to search in the first half.
// if mid^2 is less or equal to N, we use the same template
// for the second half again.
// The specialization that ends the recursive process is
// when LO and HI have the same value M, which is the final result.
// primary template to compute sqrt(N)
template<intN, intLO=1, intHI=N>
classSqrt
{
public:
// compute the midpoint, rounded up
enum {mid=(LO+HI+1)/2};
// search a not too large value in the halved interval
enum {result = (N<mid*mid) ? Sqrt<N,LO,mid-1>::result
: Sqrt<N,mid,HI>::result};
};
// partial specialization for the case when LO equal HI
template<intN, intM>
classSqrt<N,M,M>
{
public:
enum {result=M};
};
Leave a Reply
Want to join the discussion?Feel free to contribute!