There are, in total, floating-point numbers. Sometimes, a numerical algorithm computes floating-point numbers outside this range.
This generates number overflow or underflow. In NumPy, the special floating-point number inf is assigned to overflow results:
exp(1000.) # inf
a = inf
3 - a # -inf
3 + a # inf
Working with inf may lead to mathematically undefined results. This is indicated in Python by assigning the result another special floating-point number, nan. This stands for not-a-number, that is, an undefined result of a mathematical operation. To demonstrate this, we continue the previous example:
a + a # inf
a - a # nan
a / a # nan
There are special rules for operations with nan and inf. For instance, nan compared to anything (even to itself) always returns False:
x = nan
x < 0 # False
x > 0 # False
x == x # False
See Exercise 4 for some surprising consequences of the fact that nan is never equal to itself.
The float inf behaves much more as expected:
0 < inf # True
inf <= inf # True
inf == inf # True
-inf < inf # True
inf - inf # nan
exp(-inf) # 0
exp(1 / inf) # 1
One way to check for nan and inf is to use the functions isnan and isinf. Often, you want to react directly when a variable gets the value nan or inf. This can be achieved by using the NumPy command seterr. The following command
seterr(all = 'raise')
would raise a FloatingPointError if a calculation were to return one of those values.