Skip to main content

relp_num/rational/big/
size.rs

1//! # Measuring an arbitrary precision rational
2use crate::integer::big::io::bit_length;
3use crate::rational::big::Big;
4use crate::traits::EncodingSize;
5
6impl<const S: usize> EncodingSize for Big<S> {
7    fn numerator_bits(&self) -> u32 {
8        bit_length(&self.numerator)
9    }
10
11    fn denominator_bits(&self) -> u32 {
12        bit_length(&self.denominator)
13    }
14}
15
16#[cfg(test)]
17mod test {
18    use std::str::FromStr;
19
20    use crate::{EncodingSize, RationalBig, RB};
21
22    #[test]
23    fn the_bits_are_counted_over_the_magnitude() {
24        assert_eq!(RB!(0).numerator_bits(), 0);
25        assert_eq!(RB!(0).denominator_bits(), 1);
26        assert_eq!(RB!(1).encoding_bits(), 2);
27        assert_eq!(RB!(-1).encoding_bits(), 2);
28        assert_eq!(RB!(255).numerator_bits(), 8);
29        assert_eq!(RB!(256).numerator_bits(), 9);
30        assert_eq!(RB!(1, 3).denominator_bits(), 2);
31    }
32
33    #[test]
34    fn a_value_that_is_small_but_expensive_says_so() {
35        // Just under one, and nothing about its magnitude says how much it costs.
36        let value = RationalBig::from_str("999999999999999999999/1000000000000000000000").unwrap();
37        assert!(value < RB!(1));
38        assert!(value.encoding_bits() > 130);
39    }
40}