Boost
C++ Libraries
...one of the most highly
regarded and expertly designed C++ library projects in the
world.
— Herb Sutter and Andrei
Alexandrescu, C++
Coding Standards
This is an older version of Boost and was released in 2015. The current version is 1.89.0.
Based on the information above, one can see that different kinds of numbers
can be differentiated based on the information stored in std::numeric_limits. This is in addition to
the traits class number_category
provided by this library.
For an integer type T, all of the following conditions hold:
std::numeric_limits<T>::is_specialized == true std::numeric_limits<T>::is_integer == true std::numeric_limits<T>::is_exact == true std::numeric_limits<T>::min_exponent == 0 std::numeric_limits<T>::max_exponent == 0 std::numeric_limits<T>::min_exponent10 == 0 std::numeric_limits<T>::max_exponent10 == 0
In addition the type is signed if:
std::numeric_limits<T>::is_signed == true
If the type is arbitrary precision then:
std::numeric_limits<T>::is_bounded == false
Otherwise the type is bounded, and returns a non zero value from:
std::numeric_limits<T>::max()
and has:
std::numeric_limits<T>::is_modulo == true
if the type implements modulo arithmetic on overflow.
Rational types are just like integers except that:
std::numeric_limits<T>::is_integer == false
There appears to be no way to tell these apart from rational types, unless they set:
std::numeric_limits<T>::is_exact == false
This is because these types are in essence a rational type with a fixed denominator.
For a floating-point type T, all of the following conditions hold:
std::numeric_limits<T>::is_specialized == true std::numeric_limits<T>::is_integer == false std::numeric_limits<T>::is_exact == false std::numeric_limits<T>::min_exponent != 0 std::numeric_limits<T>::max_exponent != 0 std::numeric_limits<T>::min_exponent10 != 0 std::numeric_limits<T>::max_exponent10 != 0
In addition the type is signed if:
std::numeric_limits<T>::is_signed == true
And the type may be decimal or binary depending on the value of:
std::numeric_limits<T>::radix
In general, there are no arbitrary precision floating-point types, and so:
std::numeric_limits<T>::is_bounded == false
Exact floating-point types are a field composed of an arbitrary precision integer scaled by an exponent. Such types have no division operator and are the same as floating-point types except:
std::numeric_limits<T>::is_exact == true
For historical reasons, complex numbers do not specialize std::numeric_limits, instead you must inspect
std::numeric_limits<T::value_type>.