Ratio::recip now corrects sign and fails for zero
This commit is contained in:
parent
c84c4d15ba
commit
8c75506f22
|
@ -135,9 +135,16 @@ impl<T: Clone + Integer> Ratio<T> {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the reciprocal.
|
/// Returns the reciprocal.
|
||||||
|
///
|
||||||
|
/// Fails if the `Ratio` is zero.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn recip(&self) -> Ratio<T> {
|
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.
|
/// Rounds towards minus infinity.
|
||||||
|
@ -669,6 +676,10 @@ mod test {
|
||||||
numer: 2,
|
numer: 2,
|
||||||
denom: 1,
|
denom: 1,
|
||||||
};
|
};
|
||||||
|
pub const _NEG2: Rational = Ratio {
|
||||||
|
numer: -2,
|
||||||
|
denom: 1,
|
||||||
|
};
|
||||||
pub const _1_2: Rational = Ratio {
|
pub const _1_2: Rational = Ratio {
|
||||||
numer: 1,
|
numer: 1,
|
||||||
denom: 2,
|
denom: 2,
|
||||||
|
@ -1007,6 +1018,16 @@ mod test {
|
||||||
assert_eq!(_1_2 * _1_2.recip(), _1);
|
assert_eq!(_1_2 * _1_2.recip(), _1);
|
||||||
assert_eq!(_3_2 * _3_2.recip(), _1);
|
assert_eq!(_3_2 * _3_2.recip(), _1);
|
||||||
assert_eq!(_NEG1_2 * _NEG1_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]
|
#[test]
|
||||||
|
|
Loading…
Reference in New Issue