@@ -44,14 +44,17 @@ where F: Float + FloatConst, Standard: Distribution<F>
44
44
/// Error type returned from `Poisson::new`.
45
45
#[ derive( Clone , Copy , Debug , PartialEq , Eq ) ]
46
46
pub enum Error {
47
- /// `lambda <= 0` or `nan`.
47
+ /// `lambda <= 0`
48
48
ShapeTooSmall ,
49
+ /// `lambda = ∞` or `lambda = nan`
50
+ NonFinite ,
49
51
}
50
52
51
53
impl fmt:: Display for Error {
52
54
fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
53
55
f. write_str ( match self {
54
56
Error :: ShapeTooSmall => "lambda is not positive in Poisson distribution" ,
57
+ Error :: NonFinite => "lambda is infinite or nan in Poisson distribution" ,
55
58
} )
56
59
}
57
60
}
@@ -66,6 +69,9 @@ where F: Float + FloatConst, Standard: Distribution<F>
66
69
/// Construct a new `Poisson` with the given shape parameter
67
70
/// `lambda`.
68
71
pub fn new ( lambda : F ) -> Result < Poisson < F > , Error > {
72
+ if !lambda. is_finite ( ) {
73
+ return Err ( Error :: NonFinite ) ;
74
+ }
69
75
if !( lambda > F :: zero ( ) ) {
70
76
return Err ( Error :: ShapeTooSmall ) ;
71
77
}
@@ -163,7 +169,7 @@ mod test {
163
169
fn test_poisson_avg ( ) {
164
170
test_poisson_avg_gen :: < f64 > ( 10.0 , 0.1 ) ;
165
171
test_poisson_avg_gen :: < f64 > ( 15.0 , 0.1 ) ;
166
-
172
+
167
173
test_poisson_avg_gen :: < f32 > ( 10.0 , 0.1 ) ;
168
174
test_poisson_avg_gen :: < f32 > ( 15.0 , 0.1 ) ;
169
175
@@ -178,6 +184,12 @@ mod test {
178
184
Poisson :: new ( 0.0 ) . unwrap ( ) ;
179
185
}
180
186
187
+ #[ test]
188
+ #[ should_panic]
189
+ fn test_poisson_invalid_lambda_infinity ( ) {
190
+ Poisson :: new ( f64:: INFINITY ) . unwrap ( ) ;
191
+ }
192
+
181
193
#[ test]
182
194
#[ should_panic]
183
195
fn test_poisson_invalid_lambda_neg ( ) {
@@ -188,4 +200,4 @@ mod test {
188
200
fn poisson_distributions_can_be_compared ( ) {
189
201
assert_eq ! ( Poisson :: new( 1.0 ) , Poisson :: new( 1.0 ) ) ;
190
202
}
191
- }
203
+ }
0 commit comments