JuliaStats / Distributions.jl

A Julia package for probability distributions and associated functions.
Other
1.11k stars 416 forks source link

Poisson rand InexactError for extremely large parameter values #821

Open simonbyrne opened 5 years ago

simonbyrne commented 5 years ago
julia> rand(Poisson(1e20))
ERROR: InexactError: Int64(Int64, 9.999999997262139e19)
Stacktrace:
 [1] Type at ./float.jl:700 [inlined]
 [2] convert at ./number.jl:7 [inlined]
 [3] rand(::Poisson{Float64}) at /Users/simon/.julia/packages/Distributions/WHjOk/src/univariate/discrete/poisson.jl:89
 [4] top-level scope at none:0

Note that the underlying Rmath library actually works in terms of Float64s (see https://github.com/JuliaStats/Rmath-julia/issues/11).

mschauer commented 5 years ago

I think it only fails if the return value is actually outside the range of Int:

julia> rand(Poisson(float(typemax(Int64))))
9223372034018728960

julia> rand(Poisson(float(typemax(Int64))))
9223372033786713088

julia> rand(Poisson(float(typemax(Int64))))
ERROR: InexactError: Int64(Int64, 9.223372040475427e18)
mschauer commented 5 years ago

PS: Someday somewhere in some parallel universe a rand(Poisson(1.0)) will fail with overflow.

simonbyrne commented 5 years ago

I guess it would be useful to have a rand(::Type{Float64}, d::Poisson) method that didn't do the conversion to Int.

CameronBieganek commented 3 years ago

It would be nice if this could return a better error message.

SamuelBrand1 commented 4 weeks ago

Any development on this issue?

devmotion commented 4 weeks ago

https://github.com/JuliaStats/Distributions.jl/pull/1433 would have fixed it but we did not want to follow through with other changes in this PR. I think we can return to the Poisson case (and other similar cases) after #1905.