|
Boost : |
From: Jan Langer (jan_at_[hidden])
Date: 2004-01-12 15:40:01
Andy Little wrote:
> I have done a bit of er hacking.
> changed the Add Mult etc to use the MPL versions.
> called it rat for no very good reason:
>
> using boost::math::rat;
> using boost::mpl::plus;
>
> typedef plus<rat<2,1>,rat<2,2> >::type Rat;
>
> Shut your eyes and think of nice things before you take a look
> Header enclosed.
i'd like to suggest the following implementation:
// compile time rational number
template<long N,long D = 1>
struct rat {
private:
static const long nabs = static_abs<N>::value;
static const long dabs = static_abs<D>::value;
// need cast to signed because
// static_gcd returns unsigned long
static const long nden_abs = static_cast <long>
(static_gcd<nabs,dabs>::value);
static const long nden = (dabs < 0) ? -nden_abs : nden_abs;
public:
static const long numerator = N/nden;
static const long denominator = D/nden;
typedef rat <numerator, denominator> type;
};
the double gcd computation can be saved, and the reduce_rat can be
eliminated by using type inside the class.
but the real point i want to make is that reduction does the following:
rat <1, -2> => rat <-1, 2>,
rat <-1, -2> => rat <1, 2>
the sign of the denominator is always positive after reduction.
ps: andy, what is the specialization of multiplies and divides good for,
which use the default arg for the second factor's denominator?
jan
-- jan langer ... jan_at_[hidden] "pi ist genau drei"
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk