[IPython-dev] from __future__ import division

Fernando Perez fperez.net at gmail.com
Thu Jun 15 04:46:04 EDT 2006


On 6/15/06, Fernando Perez <fperez.net at gmail.com> wrote:
> On 6/15/06, Gaël Varoquaux <gael.varoquaux at normalesup.org> wrote:

> >     If I start ipython with no switch, this works fine. If I start it
> > with "-pylab" switch", then I get an "OverflowError: math range error" on
> > the last line. This is a minimal example. Removing "w_O" from the
> > definition of "w" gets rid of the error.

OK, here's your problem:

In [2]: xmode
Exception reporting mode: Verbose

In [3]: run divbug
2/3 is not 0!  0.666666666667

scipy version: 0.5.0.1940
mpl   version: 0.87.3
numerix flag : Numeric
---------------------------------------------------------------------------
exceptions.OverflowError                             Traceback (most
recent call last)

/home/fperez/test/divbug.py
     27 [Xgrid,Ygrid] = S.mgrid[-xrange:(xrange+dx):dx,-yrange:(yrange+dy):dy]
     28
---> 29 GaussianMap = Gaussian_beam(Ygrid,0)
        GaussianMap = undefined
        Gaussian_beam = <function Gaussian_beam at 0x42741a74>
        Ygrid = array([[-0.002  , -0.00196, -0.00192, ...,  0.00192,
0.00196,  0.002  ],
       [-0.002  , -0.00196, -0.00192, ...,  0.00192,  0.00196,  0.002  ],
       [-0.002  , -0.00196, -0.00192, ...,  0.00192,  0.00196,  0.002  ],
       ...,
       [-0.002  , -0.00196, -0.00192, ...,  0.00192,  0.00196,  0.002  ],
       [-0.002  , -0.00196, -0.00192, ...,  0.00192,  0.00196,  0.002  ],
       [-0.002  , -0.00196, -0.00192, ...,  0.00192,  0.00196,  0.002  ]])
     30
     31 print

/home/fperez/test/divbug.py in Gaussian_beam(y=array([[-0.002  ,
-0.00196, -0.00192, ...,  0.00...6, -0.00192, ...,  0.00192,  0.00196,
 0.002  ]]), z=0)
     16 def Gaussian_beam(y,z):
     17     wz = w(z)
---> 18     out = P.exp(-(y**2)/(2*wz**2))
        out = undefined
        global P.exp = <ufunc 'exp'>
        y = array([[-0.002  , -0.00196, -0.00192, ...,  0.00192,
0.00196,  0.002  ],
       [-0.002  , -0.00196, -0.00192, ...,  0.00192,  0.00196,  0.002  ],
       [-0.002  , -0.00196, -0.00192, ...,  0.00192,  0.00196,  0.002  ],
       ...,
       [-0.002  , -0.00196, -0.00192, ...,  0.00192,  0.00196,  0.002  ],
       [-0.002  , -0.00196, -0.00192, ...,  0.00192,  0.00196,  0.002  ],
       [-0.002  , -0.00196, -0.00192, ...,  0.00192,  0.00196,  0.002  ]])
        wz = 5.0000000000000002e-05
     19     return out
     20

OverflowError: math range error
WARNING: Failure executing file: <divbug.py>


It appears when you use the 'Numeric' value for numerix in pylab:
NUmeric didn't handle underflow very gracefully.  The smallest value
in the argument to P.exp()  is -800:

ipdb> aa=-(y**2)/(2*wz**2)
ipdb> bb=P.reshape(aa,(101*101,))
ipdb> P.amin(bb)
-800.0
ipdb> P.exp(-800)
*** OverflowError: math range error

You can see that this is the actual problem in a direct manner:

In [1]: import numpy

In [2]: import Numeric

In [3]: numpy.exp(-800)
Out[3]: 0.0

In [4]: Numeric.exp(-800)
---------------------------------------------------------------------------
exceptions.OverflowError                             Traceback (most
recent call last)

/home/fperez/test/<ipython console>

OverflowError: math range error


Since Numeric is unmaintained, you'll need to either switch to numpy,
or mask its exp function with a 'safe' one which underflows (IPython
provides one, in IPython.numutils.exp_safe precisely for this
purpose).

Cheers,

f




More information about the IPython-dev mailing list