Hi Ken,
Greetings from the other end of the country!
I reconstructed your table , entering only the Diff values in column C and the names in column A.
My formula (shown below the table) is the same as yours, with the exception that I made the table large enough to contain the list, with no extra rows, dropped the .3 from the end of the diff values (it made no difference to the rank, and would only become significant if the participants estimated to the nearest 100m) Rounding the actual distance to the nearest km would also remove the (consistent) .3 from the Diff column, for a cleaner result.
Here's my table, with the formula displayed under the table, and a text version of your formula below that.

The the main issue I see with your formula is the reversal of the first two arguments of the RANK function.
Here's the syntax of that function:
RANK(value, value-set, largest-is-high)
'value' is the individual value to be ranked. (C2),
'value-set' is the set of numbers within which the rank will be determined (C$2:C$21),
'largest-is-high' tells Numbers to assign the 'highest rank number' to the largest value
and the 'lowest rank number' ( 1 ) to the smallest value in the set.
Unless you are filling the formula left or right into new columns, the absolute reference operator ($) before C serves no purpose, and can be omitted. The same operator, before 2 and 21 is necessary given the notation you have used, to keep the range reference to C2:C21 as the formula is filled down.
Your formula revised: RANK(C2,C$2:C$21,1)
Enter as shown in D2, then fill down to the end o the column.
Regards,
Barry