【问题标题】:How do I sort `NaN` so that it is greater than any other number, and equal to any other `NaN`?如何对“NaN”进行排序,使其大于任何其他数字,并等于任何其他“NaN”?
【发布时间】:2016-11-03 17:58:41
【问题描述】:

我正在根据两个标准对向量进行排序。第一个是一个浮点数,可以是NaN,第二个是一个字符串,用于按字典顺序打断。

vec.sort_by(|a, b| {
    match (foo(a) as f64 / bar(a) as f64).partial_cmp(&(foo(b) as f64 / bar(b) as f64)) {
        Some(x) => {
            Ordering::Equal => name(a).cmp(name(b)),
            other => other,
        }
        None() => {
            //Not sure what to put here.
        }
    }
}

foo(a) 返回 int > 0, bar(a) 返回 int >= 0, name(a) 返回& String

如何对NaN 进行排序,使其大于任何其他数字,并等于任何其他NaN(字典式决胜局)?

【问题讨论】:

    标签: sorting floating-point rust


    【解决方案1】:

    您已经知道如何处理平局,您所需要做的就是以所需的方式比较浮点数。只需...编写您描述的代码:

    use std::cmp::Ordering;
    use std::f32;
    
    fn main() {
        let mut vec = [91.0, f32::NAN, 42.0]; 
    
        vec.sort_by(|&a, &b| {
            match (a.is_nan(), b.is_nan()) {
                (true, true) => Ordering::Equal,
                (true, false) => Ordering::Greater,
                (false, true) => Ordering::Less,
                (false, false) => a.partial_cmp(&b).unwrap(),
            }
        });
    
        println!("{:?}", vec);
    }
    

    您可能会喜欢并将其包装在一个代表密钥的结构中:

    use std::cmp::Ordering;
    use std::f32;
    
    fn main() {
        let mut vec = [91.0, f32::NAN, 42.0];
    
        vec.sort_by_key(|&a| MyNanKey(a));
    
        println!("{:?}", vec);
    }
    
    #[derive(Debug, Copy, Clone, PartialEq)]
    struct MyNanKey(f32);
    
    impl Eq for MyNanKey {}
    
    impl PartialOrd for MyNanKey {
        fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
            Some(self.cmp(other))
        }
    }
    
    impl Ord for MyNanKey {
        fn cmp(&self, other: &Self) -> Ordering {
            match (self.0.is_nan(), other.0.is_nan()) {
                (true, true) => Ordering::Equal,
                (true, false) => Ordering::Greater,
                (false, true) => Ordering::Less,
                (false, false) => self.0.partial_cmp(&other.0).unwrap(),
            }
        }
    }
    

    我没有考虑这是否适用于各种无穷大或非规范化浮点值,所以要小心。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-30
      • 2019-09-25
      • 2021-09-20
      相关资源
      最近更新 更多