Re: std::max and NAN
"Mycroft Holmes" <m.holmes@nospam.it> wrote in message
news:%23jJGoaBMIHA.820@TK2MSFTNGP06.phx.gbl
does the standard say anything about the behaviour of std::min/max
does on (say, double) NAN?
Yes. It says the behavior is undefined.
25.3.7 Minimum and maximum [lib.alg.min.max]
template<class T> const T& min(const T& a, const T& b);
template<class T, class Compare>
const T& min(const T& a, const T& b, Compare comp);
1 Requires: Type T is LessThanComparable (20.1.2) and CopyConstructible
(20.1.3).
2 Returns: The smaller value.
3 Notes: Returns the first argument when the arguments are equivalent.
20.1.2 Less than comparison
Table 29?LessThanComparable requirements
expression | return type | requirement
a < b | convertible to bool | < is a strict weak ordering relation
(25.3)
25.3/4 The term strict refers to the requirement of an irreflexive
relation (!comp(x, x) for all x), and the term weak to requirements that
are not as strong as those for a total ordering, but stronger than those
for a partial ordering. If we define equiv(a, b) as !comp(a, b) &&
!comp(b, a), then the requirements are that comp and equiv both be
transitive relations:
? comp(a, b) && comp(b, c) implies comp(a, c)
? equiv(a, b) && equiv(b, c) implies equiv(a, c)
The usual less-than relation on dobules is not a strict weak ordering in
the presence of NANs. Specifically, NAN is equivalent to any other
number ( !(NAN < x) && !(x < NAN) holds for any x), but the resulting
equiv relation is not transitive ( equiv(1.0, NAN) && equiv(NAN, 2.0)
but not equiv(1.0, 2.0) ).
--
With best wishes,
Igor Tandetnik
With sufficient thrust, pigs fly just fine. However, this is not
necessarily a good idea. It is hard to be sure where they are going to
land, and it could be dangerous sitting under them as they fly
overhead. -- RFC 1925