# 23 General utilities library [utilities]

## 23.16 Compile-time rational arithmetic [ratio]

namespace std {
template <intmax_t N, intmax_t D = 1>
class ratio {
public:
static constexpr intmax_t num;
static constexpr intmax_t den;
using type = ratio<num, den>;
};
}

If the template argument D is zero or the absolute values of either of the
template arguments N and D is not representable by type
intmax_t, the program is ill-formed. [ Note: These rules ensure that infinite
ratios are avoided and that for any negative input, there exists a representable value
of its absolute value which is positive. In a two's complement representation, this
excludes the most negative value. — end note ]

The static data members num and den shall have the following values,
where gcd represents the greatest common divisor of the absolute values of
N and D: