Misc #10424

Error message when sorting NaN

Added by jmthomas (Jason Thomas) over 6 years ago. Updated over 6 years ago.



When sorting an array of floats with a NaN you get a very confusing message:
irb(main):001:0> [0.0/0.0,1.0,2.0].sort
ArgumentError: comparison of Float with Float failed

Sorting a nil is much friendlier:
irb(main):012:0> [nil,1.0,2.0].sort
ArgumentError: comparison of NilClass with Float failed

This is confusing for many. Simply google for "comparison of Float with Float failed" and makes for a difficult debugging session for anyone who doesn't know that NaN produces this result. What I would expect is:
irb(main):001:0> [0.0/0.0,1.0,2.0].sort
ArgumentError: comparison of NaN with Float failed

Updated by cremno (cremno phobia) over 6 years ago

I think rb_cmperr() behaves weird anyway. If y is a “special const” (e.g. nil, true, or even a flonum (boxed Float)!), then the result of #inspect, and not the class, is used. So the error message I get, is different from yours!

[0.0/0.0,1.0,2.0].sort  # => ArgumentError: comparison of Float with 1.0 failed

It probably would be preferable to print both - value and class. For example:

[0.0/0.0,1.0,2.0].sort  # => ArgumentError: comparison of Float (NaN) with Float (1.0) failed

Also available in: Atom PDF