[Numpy-discussion] Random int64 and float64 numbers

David Cournapeau david@ar.media.kyoto-u.ac...
Sun Nov 1 20:20:13 CST 2009

```Thomas Robitaille wrote:
> Hi,
>
> I'm trying to generate random 64-bit integer values for integers and
> floats using Numpy, within the entire range of valid values for that
> type. To generate random 32-bit floats, I can use:
>
> np.random.uniform(low=np.finfo(np.float32).min,high=np.finfo
> (np.float32).max,size=10)
>
> which gives for example
>
> array([  1.47351436e+37,   9.93620693e+37,   2.22893053e+38,
>          -3.33828977e+38,   1.08247781e+37,  -8.37481260e+37,
>           2.64176554e+38,  -2.72207226e+37,   2.54790459e+38,
>          -2.47883866e+38])
>
> but if I try and use this for 64-bit numbers, i.e.
>
> np.random.uniform(low=np.finfo(np.float64).min,high=np.finfo
> (np.float64).max,size=10)
>
> I get
>
> array([ Inf,  Inf,  Inf,  Inf,  Inf,  Inf,  Inf,  Inf,  Inf,  Inf])
>
> Similarly, for integers, I can successfully generate random 32-bit
> integers:
>
> np.random.random_integers(np.iinfo(np.int32).min,high=np.iinfo
> (np.int32).max,size=10)
>
> which gives
>
> array([-1506183689,   662982379, -1616890435, -1519456789,  1489753527,
>          -604311122,  2034533014,   449680073,  -444302414,
> -1924170329])
>
> but am unsuccessful for 64-bit integers, i.e.
>
> np.random.random_integers(np.iinfo(np.int64).min,high=np.iinfo
> (np.int64).max,size=10)
>
> which produces the following error:
>
> OverflowError: long int too large to convert to int
>
> Is this expected behavior, or are these bugs?
>

I think those are bugs, but it may be difficult to fix.

You can check that if you restrict a tiny bit your interval, you get
better result:

import numpy as np
# max/min for double precision is ~ 1.8e308
low, high = -1e308, 1e308
np.random.uniformat(low, high, 100) # bunch of inf
low, high = -1e307, 1e307
np.random.uniformat(low, high, 100) # much more reasonable

It may be that you are pushing the limits of the random generator. Your
min and max may be border cases: if you use the min/max representable
numbers, and the random generator needs to do any addition of a positive
number, you will 'overflow' your float number (Robert will have a better
answer to this). The problem is that it may be difficult to detect this