I have a list in which each item has 2 integer attributes, n and m. I would like to map these two integer attributes to a single new attribute so that when the list is sorted on the new attribute, it is sorted on n first and then ties are broken with m.
I came up with n – 1/m. So the two integers are mapped to a single real number. I think this works. Any better ideas?
That’s clever, so I hate to break it to you, but it won’t work. Try it (with a computer) using the n=1,000,000,000 and values of m between 999,999,990 and 1,000,000,010. You’ll find that
n-1/mis the same value for all of those cases.It would work if floating point numbers had infinite precision, or even if they had twice as much precision as an int (although even there you might run into some issues), but they don’t: a double precision floating point number has 53 bits of precision. An integer is (probably) 32 bits, so you’d need at least 64 bits to encode two of them. But then, you could just use a 64-bit (long long) integer, encoding the pair as
n*2^32 + m.