浮点 – 如何获得包含浮点数的迭代器的最小值或最大值?

我理解why the floats don’t have an implementation for Ord但是当我想要懒惰并使用迭代器时,这对我没有特别的帮助.

是否有一种解决方法或一种简单的方法来获取包含浮点数的迭代器的最小值/最小值/ min_by?

我知道可以排序(这很慢)或将其包装在另一种类型中并实现所需的交易(这是冗长的),但我希望有一些更优雅的东西.

最佳答案
Floats有自己的minmax方法可以一致地处理NaN,所以你可以折叠迭代器:

use std::f64;

fn main() {
    let x = [2.0, 1.0, -10.0, 5.0, f64::NAN];

    let min = x.iter().fold(f64::INFINITY, |a, &b| a.min(b));
    println!("{}", min);
}

打印-10.

如果您想要不同的NaN处理,可以使用PartialOrd :: partial_cmp.例如,如果您希望传播NaN,请折叠:

use std::f64;
use std::cmp::Ordering;

fn main() {
    let x = [2.0, 1.0, -10.0, 5.0, f64::NAN];

    let min = x.iter().fold(f64::INFINITY, |a, &b| {
        match PartialOrd::partial_cmp(&a, &b) {
            None => f64::NAN,
            Some(Ordering::Less) => a,
            Some(_) => b,
        }
    });
    println!("{}", min);
}

转载注明原文:浮点 – 如何获得包含浮点数的迭代器的最小值或最大值? - 代码日志