qfall_math/rational/q/
distance.rs1use super::Q;
12use crate::traits::Distance;
13
14impl<Rational: Into<Q>> Distance<Rational> for Q {
15 type Output = Q;
16
17 fn distance(&self, other: Rational) -> Self::Output {
41 let other = other.into();
42 let difference = other - self;
43 difference.abs()
44 }
45}
46
47#[cfg(test)]
48mod test_distance {
49 use super::{Distance, Q};
50
51 #[test]
54 fn small_values() {
55 let a = Q::ONE;
56 let b = Q::from((5, -15));
57 let zero = Q::ZERO;
58
59 assert_eq!(Q::ONE, a.distance(&zero));
60 assert_eq!(Q::ONE, zero.distance(&a));
61 assert_eq!(Q::from((4, 3)), a.distance(&b));
62 assert_eq!(Q::from((4, 3)), b.distance(&a));
63 assert_eq!(Q::from((1, 3)), b.distance(&zero));
64 assert_eq!(Q::from((1, 3)), zero.distance(&b));
65 assert_eq!(Q::ZERO, b.distance(&b));
66 }
67
68 #[test]
71 fn large_values() {
72 let a = Q::from(i64::MAX);
73 let b = Q::from(i64::MIN);
74 let zero = Q::ZERO;
75
76 assert_eq!(&a - &b, a.distance(&b));
77 assert_eq!(&a - &b, b.distance(&a));
78 assert_eq!(a, a.distance(&zero));
79 assert_eq!(a, zero.distance(&a));
80 assert_eq!(&a + Q::ONE, b.distance(&zero));
81 assert_eq!(&a + Q::ONE, zero.distance(&b));
82 assert_eq!(Q::ZERO, a.distance(&a));
83 }
84
85 #[test]
87 fn availability() {
88 let a = Q::ZERO;
89
90 let u_0 = a.distance(0_u8);
91 let u_1 = a.distance(15_u16);
92 let u_2 = a.distance(35_u32);
93 let u_3 = a.distance(u64::MAX);
94 let i_0 = a.distance(0_i8);
95 let i_1 = a.distance(-15_i16);
96 let i_2 = a.distance(35_i32);
97 let i_3 = a.distance(i64::MIN);
98 let f_0 = a.distance(4.25_f32);
99 let f_1 = a.distance(0.66015625_f64);
100
101 assert_eq!(Q::ZERO, u_0);
102 assert_eq!(Q::from(15), u_1);
103 assert_eq!(Q::from(35), u_2);
104 assert_eq!(Q::from(u64::MAX), u_3);
105 assert_eq!(Q::ZERO, i_0);
106 assert_eq!(Q::from(15), i_1);
107 assert_eq!(Q::from(35), i_2);
108 assert_eq!(Q::from(i64::MIN).abs(), i_3);
109 assert_eq!(Q::from((425, 100)), f_0);
110 assert_eq!(Q::from((169, 256)), f_1);
111 }
112}