...one of the most highly
regarded and expertly designed C++ library projects in the
world.

— Herb Sutter and Andrei
Alexandrescu, C++
Coding Standards

boost::units::static_rational — Compile time rational number.

// In header: <boost/units/static_rational.hpp>template<integer_type N, integer_type D = 1>classstatic_rational {public:// typestypedefunspecifiedtag;typedefstatic_rational< Numerator, Denominator > type;// static_rational<N,D> reduced by GCD// construct/copy/destructstatic_rational();// public static functionsstaticinteger_type numerator() ;staticinteger_type denominator() ;staticconstinteger_type Numerator;staticconstinteger_type Denominator; };

This is an implementation of a compile time rational number, where `static_rational<N,D>`

represents a rational number with numerator `N`

and denominator `D`

. Because of the potential for ambiguity arising from multiple equivalent values of `static_rational`

(e.g. `static_rational<6,2>==static_rational<3>`

), static rationals should always be accessed through `static_rational<N,D>::type`

. Template specialization prevents instantiation of zero denominators (i.e. `static_rational<N,0>`

). The following compile-time arithmetic operators are provided for static_rational variables only (no operators are defined between long and static_rational):

`mpl::negate`

`mpl::plus`

`mpl::minus`

`mpl::times`

`mpl::divides`

Neither `static_power`

nor `static_root`

are defined for `static_rational`

. This is because template types may not be floating point values, while powers and roots of rational numbers can produce floating point values.