relp_num/rational/big/
size.rs1use 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 let value = RationalBig::from_str("999999999999999999999/1000000000000000000000").unwrap();
37 assert!(value < RB!(1));
38 assert!(value.encoding_bits() > 130);
39 }
40}