我理解why the floats don't have an implementation for Ord
,但当我想懒惰和使用迭代器时,这对我并没有特别的帮助.
是否有一种解决方法或简单的方法来获取包含浮点数的迭代器的最小/min/min_?
我知道一个人可以进行排序(这很慢),或者用另一种类型进行包装,并实现所需的交易(这很冗长),但我希望有更优雅的东西.
我理解why the floats don't have an implementation for Ord
,但当我想懒惰和使用迭代器时,这对我并没有特别的帮助.
是否有一种解决方法或简单的方法来获取包含浮点数的迭代器的最小/min/min_?
我知道一个人可以进行排序(这很慢),或者用另一种类型进行包装,并实现所需的交易(这很冗长),但我希望有更优雅的东西.
float有自己的min
和max
个方法,可以一致地处理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);
}