我明白了why the floats don't have an implementation for Ord
但当我想偷懒并使用迭代器时,这对我没有特别帮助。
是否有解决方法或简单的方法来获取包含 float 的迭代器的最小值/最小值/min_by?
我知道可以对它进行排序(这很慢)或将其包装在另一种类型中并实现所需的交易(这很冗长),但我希望有一些更优雅的东西。
最佳答案
花车有自己的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);
}
关于floating-point - 如何获取包含 float 的迭代器的最小值或最大值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28446632/