When I run this code:
#include
#include
#define T double
int main()
{
static const T val = std::numeric_limits::
Because min
gives you the smallest normalized value. You can still have smaller denormalized values (see http://en.wikipedia.org/wiki/Denormalized_number).
Historical reasons. std::numeric_limits
was originally built
around the contents of <limits.h>
(where you have e.g.
INT_MIN
) and <float.h>
(where you have e.g. DBL_MIN
).
These two files were (I suspect) designed by different people;
people doing floating point don't need a separate most positive
and most negative value, because the most negative is always the
negation of the most positive, but they do need to know the
smallest value greater than 0. Regretfully, the values have the
same pattern for the name, and std::numeric_limits
ended up
defining the semantics of min
differently depending on
std::numeric_limits<>::is_integer
.
This makes template programming more awkward, you keep having to
do things like std::numeric_limits<T>::is_integer ? std::numeric_limits<T>::min() : -std::numeric_limits<T>::max()
so C++11 adds std::numeric_limits<>::lowest()
, which does
exactly what you'd expect.