[Numpy-tickets] [NumPy] #519: allclose fails with inf

NumPy numpy-tickets@scipy....
Sun May 13 21:29:23 CDT 2007


#519: allclose fails with inf
------------------------+---------------------------------------------------
 Reporter:  qwerty      |       Owner:  somebody    
     Type:  defect      |      Status:  new         
 Priority:  normal      |   Milestone:              
Component:  numpy.core  |     Version:  1.0.1       
 Severity:  normal      |    Keywords:  allclose inf
------------------------+---------------------------------------------------
 allclose(x,y, rtol, atol)

 | x - y | < atol + rtol * | y |


 This formula is good so long as x and y do not contain inf (-inf) at the
 same index.  In such a case, the difference is not well-defined.  The
 problem then, is that allclose fails and returns False when it should be
 returning True.

 {{{
 >>> a = array([log(0)])
 >>> b = array([log(0)])
 >>> a == b
 array([True], dtype=bool)
 >>> allclose(a,b)
 False
 }}}

 alltrue(a==b) will work if you have an array of inf...but this is
 definitely undesirable when you comparing floats.  Somehow, it would be
 nice if the following returned True instead of False.

 {{{
 >>> a = array([log(0), log(.5)])
 >>> b = array([log(0), log(.5000000001)])
 >>> allclose(a,b)
 False
 }}}

 Eck. Here is an uninformed solution:

 {{{
 pruned_x = []
 pruned_y = []
 for xx, yy in zip(x,y):
   if xx != yy:
     pruned_x.append(xx)
     pruned_y.append(yy)
 return old_allclose(array(pruned_x), array(pruned_y))
 }}}

 This means we'd need an additional run through the values, but this
 certainly makes results more predictable...and prevents the operator from
 having to check for cases like these.

-- 
Ticket URL: <http://projects.scipy.org/scipy/numpy/ticket/519>
NumPy <http://projects.scipy.org/scipy/numpy>
The fundamental package needed for scientific computing with Python.


More information about the Numpy-tickets mailing list