I have a PR up for review that adds "maximum difference" to the error messages produced by NumPy's testing functions for comparing arrays:

https://github.com/numpy/numpy/pull/12591Because this changes NumPy's public interface, I'm running it by the mailing list to see if there are any objections or suggestions for improvement.

Example behavior:

>>> x = np.array([1, 2, 3])

>>> y = np.array([1, 2, 3.0001])

>>> np.testing.assert_allclose(x, y)

AssertionError:

Not equal to tolerance rtol=1e-07, atol=0

(mismatch 33.333333333333336%, maximum difference 0.00010000000000021103)

x: array([1, 2, 3])

y: array([1. , 2. , 3.0001])

Motivation: when writing numerical algorithms, I frequently find myself experimenting to pick the right value of atol and rtol for np.testing.assert_allclose(). If I make the tolerance too generous, I risk missing regressions in accuracy, so I usually try to pick the smallest values for which tests pass. This change immediately reveals appropriate values to use for these parameters, so I don't need to guess and check.

One alternative would be print both "atol" and "rtol" numbers directly that could be immediately used in assert_allclose(). Here we effectively only have "atol". The main reason why I didn't do this is that I felt it would add more clutter (rtol is slightly redundant with the displayed array values). But we could probably do this if we're willing to split the error message onto a few more lines, e.g.,

Motivation: when writing numerical algorithms, I frequently find myself experimenting to pick the right value of atol and rtol for np.testing.assert_allclose(). If I make the tolerance too generous, I risk missing regressions in accuracy, so I usually try to pick the smallest values for which tests pass. This change immediately reveals appropriate values to use for these parameters, so I don't need to guess and check.

One alternative would be print both "atol" and "rtol" numbers directly that could be immediately used in assert_allclose(). Here we effectively only have "atol". The main reason why I didn't do this is that I felt it would add more clutter (rtol is slightly redundant with the displayed array values). But we could probably do this if we're willing to split the error message onto a few more lines, e.g.,

AssertionError:

Not equal to tolerance rtol=1e-07, atol=0

(mismatch 33.333333333333336%,

maximum absolute difference 0.00010000000000021103,

maximum relative difference 3.333333333340368e-05)

x: array([1, 2, 3])

y: array([1. , 2. , 3.0001])

Best,

Stephan