Listing 2
// Listing2.h: scaled multiplication and rounded division
template <typename T> inline T scaled_multiplication(T a, T b, int s)
{
T p = rounded_division(a * b, (T)s);
return p;
}// end rounded_multiplication
template <typename T> inline T rounded_division(T n, T d)
{
T q = n / d;
T r = n % d;
# if defined BRANCH_FREE
q += sign(n^d) & neg(abs(d) - (abs(r)<<1) - 1);
# elif defined NO_ROUNDING
# else
if (n < 0)
if (d < 0)
{// num -, den -, quot +, rem -
if ((r << 1) < d)
++q;
}
else // d >= 0)
{// num -, den +, quot -, rem -
if ((-r << 1) > d)
--q;
}
else // n >= 0
if (d < 0)
{// num +, den -, quot -, rem +
if ((-r << 1) < d)
--q;
}
else // d >= 0
{// num +, den +, quot +, rem +
if ((r << 1) > d)
++q;
}
# endif
return q;
} // end rounded_division