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