1use core::cmp::Ordering;
2use num::Float;
3
4pub fn fcmp<T>(lhs: &T, rhs: &T) -> Ordering
6where
7 T: Float,
8{
9 match lhs.partial_cmp(rhs) {
10 Some(ordering) => ordering,
11 None => {
12 if lhs.is_nan() {
13 if rhs.is_nan() {
14 Ordering::Equal
15 } else {
16 Ordering::Greater
17 }
18 } else {
19 Ordering::Less
20 }
21 }
22 }
23}
24
25#[cfg(test)]
26mod tests {
27 use super::*;
28
29 #[test]
30 fn test_equal() {
31 let a: f64 = 3.4;
32 let b: f64 = 3.4;
33 assert_eq!(fcmp(&a, &b), Ordering::Equal);
34 }
35
36 #[test]
37 fn test_less() {
38 let a: f64 = 2.4;
39 let b: f64 = 3.4;
40 assert_eq!(fcmp(&a, &b), Ordering::Less);
41 }
42
43 #[test]
44 fn test_greater() {
45 let a: f64 = 4.4;
46 let b: f64 = 3.4;
47 assert_eq!(fcmp(&a, &b), Ordering::Greater);
48 }
49
50 #[test]
51 fn test_nan_nan() {
52 let a: f64 = f64::NAN;
53 let b: f64 = f64::NAN;
54 assert_eq!(fcmp(&a, &b), Ordering::Equal);
55 }
56
57 #[test]
58 fn test_nan_value() {
59 let a: f64 = f64::NAN;
60 let b: f64 = 3.4;
61 assert_eq!(fcmp(&a, &b), Ordering::Greater);
62 }
63
64 #[test]
65 fn test_value_nan() {
66 let a: f64 = 3.4;
67 let b: f64 = f64::NAN;
68 assert_eq!(fcmp(&a, &b), Ordering::Less);
69 }
70}