Sorting floats
A floating-point mystery
Here's a bug I ran into several years ago. Assume we have a bunch of points defined by their coordinates and we want their pairwise distances in increasing order:
distances = [dist(x, y) for x, y in itertools.combinations(points, 2)] distances.sort()
Here dist
is a function that computes some kind of distance measure. The details don't matter much but let's say that it's Manhattan distance,
def dist(x, y): return sum(abs(a - b) for a, b in zip(x, y))
Now we have the distances in order so that distances[0]
is the smallest and distances[-1]
is the largest... right? But it turned out that distances[0]
was not the same as min(distances)
.
If you want to ponder the mystery yourself, the question is how to complete the assignment points = ...
so that the assertion at the end fails:
import itertools def dist(x, y): return sum(abs(a - b) for a, b in zip(x, y)) points = ... distances = [dist(x, y) for x, y in itertools.combinations(points, 2)] distances.sort() assert distances[0] == min(distances)