Comparisons of incompatible types
Mark Wooding
mdw at distorted.org.uk
Thu Dec 9 07:21:45 EST 2010
John Nagle <nagle at animats.com> writes:
> >>> NaN = float("nan")
> >>> arr = [1.0, 4.0, 3.0, 2.0, 5.0, NaN, 6.0, 3.0, NaN, 0.0, 1.0, 4.0,
> 3.0, 2.0, 5.0, NaN, 6.0, 3.0, NaN, 0.0]
> >>> sorted(arr)
> [0.0, 0.0, 1.0, 1.0, 2.0, 2.0, 3.0, 3.0, 3.0, 3.0, 4.0, 5.0, nan, 5.0, 6.0,
> nan, 4.0, nan, 6.0, nan]
>
> The sorted numerical values aren't in order.
Indeed. You failed to provide a valid ordering to `sorted'. By failing
to satisfy its precondition, you relieved it of its obligation to
satisfy its postcondition.
> "sort" has failed because it assumes that a < b and b < c implies a <
> c. But that's not a valid assumption here.
>
> It's not good to break trichotomy.
You're confused. The property
a < b and b < c => a < c
is called `transitivity'. But the `float' ordering /is/ transitive.
Note that a < b implies that neither a nor b is a NaN.
Also, trichotomy is unnecessary for sorting, and Python's `sort' method
doesn't require it; it does require a total preorder, though. What
properties does a total preorder require?
1. Transitivity: a <= b and b <= c => a <= c
2. Totality: a <= b or b <= a
The above list sorting goes wrong because the `float' ordering isn't
total. In particular, x </= NaN and NaN </= x for all x (including x =
NaN!).
So, your last remark is in the right direction (though strict trichotomy
is unnecessary, as I've mentioned), but apparently only by accident
since the preceding discussion is completely wrong.
-- [mdw]
More information about the Python-list
mailing list