[Numpy-discussion] comparing floating point numbers

Keith Goodman kwgoodman at gmail.com
Mon Jul 19 21:40:28 EDT 2010


On Mon, Jul 19, 2010 at 6:31 PM, Ondrej Certik <ondrej at certik.cz> wrote:
> Hi,
>
> I was always using something like
>
> abs(x-y) < eps
>
> or
>
> (abs(x-y) < eps).all()
>
> but today I needed to also make sure this works for larger numbers,
> where I need to compare relative errors, so I found this:
>
> http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm
>
> and wrote this:
>
> def feq(a, b, max_relative_error=1e-12, max_absolute_error=1e-12):
>    a = float(a)
>    b = float(b)
>    # if the numbers are close enough (absolutely), then they are equal
>    if abs(a-b) < max_absolute_error:
>        return True
>    # if not, they can still be equal if their relative error is small
>    if abs(b) > abs(a):
>        relative_error = abs((a-b)/b)
>    else:
>        relative_error = abs((a-b)/a)
>    return relative_error <= max_relative_error
>
>
> Is there any function in numpy, that implements this? Or maybe even
> the better, integer based version, as referenced in the link above?
>
> I need this in tests, where I calculate something on some mesh, then
> compare to the correct solution projected on some other mesh, so I
> have to deal with accuracy issues.

Is allclose close enough?

np.allclose(a, b, rtol=1.0000000000000001e-05, atol=1e-08)

    Returns True if two arrays are element-wise equal within a tolerance.

    The tolerance values are positive, typically very small numbers.  The
    relative difference (`rtol` * abs(`b`)) and the absolute difference
    `atol` are added together to compare against the absolute difference
    between `a` and `b`.



More information about the NumPy-Discussion mailing list