Search code examples
matlabfloating-point

What are the best practices for floating-point comparisons in MATLAB?


Obviously, float comparison is always tricky. I have a lot of assert-check in my (scientific) code, so very often I have to check for equality of sums to one, and similar issues.

Is there a quick-and easy / best-practice way of performing those checks?

The easiest way I can think of is to build a custom function for fixed tolerance float comparison, but that seems quite ugly to me. I'd prefer a built-in solution, or at least something that is extremely clear and straightforward to understand.


Solution

  • I think it's most likely going to have to be a function you write yourself. I use three things pretty constantly for running computational vector tests so to speak:

    Maximum absolute error

    return max(abs(result(:) - expected(:))) < tolerance
    

    This calculates maximum absolute error point-wise and tells you whether that's less than some tolerance.

    Maximum excessive error count

    return sum( (abs(result(:) - expected(:))) < tolerance )
    

    This returns the number of points that fall outside your tolerance range. It's also easy to modify to return percentage.

    Root mean squared error

    return norm(result(:) - expected(:)) < rmsTolerance
    

    Since these and many other criteria exist for comparing arrays of floats, I would suggest writing a function which would accept the calculation result, the expected result, the tolerance and the comparison method. This way you can make your checks very compact, and it's going to be much less ugly than trying to explain what it is that you're doing in comments.