Ratio::recip now corrects sign and fails for zero

This commit is contained in:
Michael Lamparski 2016-07-21 21:35:10 -04:00
parent c84c4d15ba
commit 8c75506f22
1 changed files with 22 additions and 1 deletions

View File

@ -135,9 +135,16 @@ impl<T: Clone + Integer> Ratio<T> {
}
/// Returns the reciprocal.
///
/// Fails if the `Ratio` is zero.
#[inline]
pub fn recip(&self) -> Ratio<T> {
Ratio::new_raw(self.denom.clone(), self.numer.clone())
match self.numer.cmp(&T::zero()) {
cmp::Ordering::Equal => panic!("numerator == 0"),
cmp::Ordering::Greater => Ratio::new_raw(self.denom.clone(), self.numer.clone()),
cmp::Ordering::Less => Ratio::new_raw(T::zero() - self.denom.clone(),
T::zero() - self.numer.clone())
}
}
/// Rounds towards minus infinity.
@ -669,6 +676,10 @@ mod test {
numer: 2,
denom: 1,
};
pub const _NEG2: Rational = Ratio {
numer: -2,
denom: 1,
};
pub const _1_2: Rational = Ratio {
numer: 1,
denom: 2,
@ -1007,6 +1018,16 @@ mod test {
assert_eq!(_1_2 * _1_2.recip(), _1);
assert_eq!(_3_2 * _3_2.recip(), _1);
assert_eq!(_NEG1_2 * _NEG1_2.recip(), _1);
assert_eq!(_3_2.recip(), _2_3);
assert_eq!(_NEG1_2.recip(), _NEG2);
assert_eq!(_NEG1_2.recip().denom(), &1);
}
#[test]
#[should_panic = "== 0"]
fn test_recip_fail() {
let _a = Ratio::new(0, 1).recip();
}
#[test]