Hacker Newsnew | past | comments | ask | show | jobs | submitlogin

like multiplying them by the precision that you'd like to compare and comparing them as integers? /s


That won't work; as integers, 100.02 and 99.997 are unequal, but 1.0002 and 0.99997 are equal at 0.01 precision. (And indeed also equal at 0.001 precision!) You'd need to round.

I had the impression that the usual way to compare floats is to define a precision and check for -p < (a - b) < p. In this case 0.99997 - 1.0002 = -0.00023, which correctly tells us that the two numbers are equal at 0.001 precision and unequal at 0.0001.


Rounding won't work either, at least if you're trying to find a way to do a hash join on float-comparison-within-epsilon. You would need to have a function such that |a-b|<p implies f(a)=f(b) and there is none, except the useless trivial one.

You can do it if you produce two hash values for each key (and clean up your duplicates later), but not if you produce only one.

Of course most of the time if you are doing equality comparisons on floats you have a fundamental conceptual problem with your code.




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: