Getting infinities with numpy.exp()

Posted on Sat 24 May 2014 in bugs

So I spent quite a lot of time this week trying to find out why I was getting infinities in one of my codes I'm working on.

In the code I have a big numpy.ndarray, let's call it a, which I then pass into numpy.exp() and save into another numpy.ndarray, let's call it b. Everything was working fine until I started detecting NaN-s somewhere later in the code. I traced the problem back to this b = numpy.exp(a) step; it turned out b contained inf at some places. More precisely, b was inf where a was around 90 or above.

So I ran python and typed:

a = 90

b = np.exp(a)

b 1.2204032943178408e+39

np.isinf(b)

False

OK, this is big, but it's not inf, right? Let's try bigger.

a = 120

b = np.exp(a)

b 1.3041808783936323e+52

np.isinf(b)

False

Still not inf. But hey, what type is b actually?

type(b)

< type 'numpy.float64' >

Everything was clear now. Throughout my code I was using numpy.float32 as the dtype of my arrays and that was the source of the problem.

Check this out:

a = np.finfo(np.float32).max

b = np.finfo(np.float32).max * 10

c = np.zeros(2, dtype = 'float32')

c[0] = a

c[1] = b

c

array([ 3.40282347e+38, inf], dtype=float32)

np.isinf(a) False

np.isinf(b) False

np.isinf(c[0]) False

np.isinf(c[1]) True

Why is b not inf and c[1] is?

Because:

type(b)

< type 'numpy.float64' >

type(c[1])

< type 'numpy.float32' >`

Point of story? Be careful what types you're using to store your data, stupid!