owasm_kit/ext/
cmp.rs

1use core::cmp::Ordering;
2use num::Float;
3
4/// A comparison function on Float data types that work with NaN.
5pub 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}