@@ -133,14 +133,16 @@ where
133133/// Error type returned from [`Exp::new`].
134134#[ derive( Clone , Copy , Debug , PartialEq , Eq ) ]
135135pub enum Error {
136- /// `lambda < 0` or `nan`.
136+ /// `lambda < 0` or is `-0.0` is `nan`.
137137 LambdaTooSmall ,
138138}
139139
140140impl fmt:: Display for Error {
141141 fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
142142 f. write_str ( match self {
143- Error :: LambdaTooSmall => "lambda is negative or NaN in exponential distribution" ,
143+ Error :: LambdaTooSmall => {
144+ "lambda is negative (including -0.0) or NaN in exponential distribution"
145+ }
144146 } )
145147 }
146148}
@@ -162,9 +164,13 @@ where
162164 /// the case `lambda = 0` is handled as follows: each sample corresponds
163165 /// to a sample from an `Exp1` multiplied by `1 / 0`. Primitive types
164166 /// yield infinity, since `1 / 0 = infinity`.
167+ ///
168+ /// The case `lambda = N::neg_zero()` returns an error, because `-0.0` is typically
169+ /// produced through underflow of computations with a negative ideal result, and
170+ /// because `1 / -0.0 = -infinity`.
165171 #[ inline]
166172 pub fn new ( lambda : F ) -> Result < Exp < F > , Error > {
167- if ! ( lambda >= F :: zero ( ) ) {
173+ if lambda. is_sign_negative ( ) || lambda . is_nan ( ) {
168174 return Err ( Error :: LambdaTooSmall ) ;
169175 }
170176 Ok ( Exp {
0 commit comments