Logically speaking, given the nature of floating point values, the maximum and minimum representable values of a float are positive and negative infinity, respectively.
Why, then, are FLT_MAX and FLT_MIN not set to them? I understand that this is “just how the standard called for”. But then, what use could FLT_MAX or FLT_MIN have as they currently lie in the middle of the representable numeric range of float? Other numeric limits have some utility because they make guarantees about comparisons (e.g. “No INT can test greater than INT_MAX”). Without that kind of guarantee, what use are these float limits at all?
A motivating example for C++:
#include <vector>
#include <limits>
template<typename T>
T find_min(const std::vector<T> &vec)
{
T result = std::numeric_limits<T>::max();
for (std::vector<T>::const_iterator p = vec.start() ; p != vec.end() ; ++p)
if (*p < result) result = *p;
return result;
}
This code works fine if T is an integral type, but not if it is a floating point type. This is annoying. (Yes yes, the standard library provides min_element, but that is not the point. The point is the pattern.)
The purpose of
FLT_MIN/MAXis to tell you what the smallest and largest representable floating-point numbers are. Infinity isn’t a number; it’s a limit.They do not lie in the middle of the representable range. There is no positive float value
xwhich you can add toFLT_MAXand get a representable number. You will get +INF. Which, as previously stated, is not a number.And how doesn’t it "work fine?" It gives you the smallest value. The only situation where it doesn’t "work fine" is if the table contains only +INF. And even in that case, it returns an actual number, not an error-code. Which is probably the better option anyway.