[Numpy-discussion] Random int64 and float64 numbers

josef.pktd at gmail.com josef.pktd at gmail.com
Sun Nov 1 22:03:25 EST 2009


On Sun, Nov 1, 2009 at 10:20 PM, David Cournapeau
<david at ar.media.kyoto-u.ac.jp> wrote:
> 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
> in advance.
>
> David
> _______________________________________________
> NumPy-Discussion mailing list
> NumPy-Discussion at scipy.org
> http://mail.scipy.org/mailman/listinfo/numpy-discussion
>


array([ Inf,  Inf,  Inf,  Inf,  Inf,  Inf,  Inf,  Inf,  Inf,  Inf])

might actually be the right answer if you want a uniform distribution
on the real line.

I never realized how many numbers are out there when I saw that most
numbers in the example are e+37 or e+38.

Josef



More information about the NumPy-Discussion mailing list