[Numpy-discussion] comparing floating point numbers

Ondrej Certik ondrej@certik...
Wed Jul 21 03:20:13 CDT 2010


Hi Keith!

On Mon, Jul 19, 2010 at 6:40 PM, Keith Goodman <kwgoodman@gmail.com> wrote:
> On Mon, Jul 19, 2010 at 6:31 PM, Ondrej Certik <ondrej@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`.

thanks for this. This should do the job. I'll give it a shot and report back.

Ondrej


More information about the NumPy-Discussion mailing list