[Numpy-discussion] Catching and dealing with floating point errors

Warren Weckesser warren.weckesser at enthought.com
Mon Nov 8 15:45:34 EST 2010


On Mon, Nov 8, 2010 at 2:17 PM, Skipper Seabold <jsseabold at gmail.com> wrote:

> On Mon, Nov 8, 2010 at 3:14 PM, Skipper Seabold <jsseabold at gmail.com>
> wrote:
> > I am doing some optimizations on random samples.  In a small number of
> > cases, the objective is not well-defined for a given sample (it's not
> > possible to tell beforehand and hopefully won't happen much in
> > practice).  What is the most numpythonic way to handle this?  It
> > doesn't look like I can use np.seterrcall in this case (without
> > ignoring its actual intent).  Here's a toy example of the method I
> > have come up with.
> >
> > import numpy as np
> >
> > def reset_seterr(d):
> >    """
> >    Helper function to reset FP error-handling to user's original settings
> >    """
> >    for action in [i+'='+"'"+d[i]+"'" for i in d]:
> >        exec(action)
> >    np.seterr(over=over, divide=divide, invalid=invalid, under=under)
> >
>
> It just occurred to me that this is unsafe.  Better options for
> resetting seterr?
>


Hey Skipper,

I don't understand why you need your helper function.  Why not just pass the
saved dictionary back to seterr()?  E.g.

saved = np.seterr('raise')
try:
    # Do something dangerous...
    result = whatever...
except Exception:
    # Handle the problems...
    result = better result...
np.seterr(**saved)
return result


Warren




>
> > def log_random_sample(X):
> >    """
> >    Toy example to catch a FP error, re-sample, and return objective
> >    """
> >    d = np.seterr() # get original values to reset
> >    np.seterr('raise') # set to raise on fp error in order to catch
> >    try:
> >        ret = np.log(X)
> >        reset_seterr(d)
> >        return ret
> >    except:
> >        lb,ub = -1,1  # includes bad domain to test recursion
> >        X = np.random.uniform(lb,ub)
> >        reset_seterr(d)
> >        return log_random_sample(X)
> >
> > lb,ub = 0,0
> > orig_setting = np.seterr()
> > X = np.random.uniform(lb,ub)
> > log_random_sample(X)
> > assert(orig_setting == np.seterr())
> >
> > This seems to work, but I'm not sure it's as transparent as it could
> > be.  If it is, then maybe it will be useful to others.
> >
> > Skipper
> >
> _______________________________________________
> NumPy-Discussion mailing list
> NumPy-Discussion at scipy.org
> http://mail.scipy.org/mailman/listinfo/numpy-discussion
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/numpy-discussion/attachments/20101108/1f6df362/attachment.html>


More information about the NumPy-Discussion mailing list