floating-point - 如何获取包含 float 的迭代器的最小值或最大值?

标签 floating-point iterator rust

我明白了why the floats don't have an implementation for Ord但当我想偷懒并使用迭代器时,这对我没有特别帮助。

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

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

最佳答案

花车有自己的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);
}

关于floating-point - 如何获取包含 float 的迭代器的最小值或最大值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28446632/

相关文章:

python - 使用嵌套迭代器有什么意义吗?

c++ - 为什么std::vector::iterator::operator->仅向下钻取一级?

rust - 我必须将 `u8` 转换为什么才能将其用作向量中的索引?

rust - 无法从另一个 crate 导入模块 - Unresolved 导入

python - 如何在 Python 3 中使用 "isclose"比较而不是绝对相等 (==) 对带有 float 的元组进行排序?

c - 理解浮点二进制模型

Rust 从迭代器中收集 HashMap

generics - 泛化两个结构

C++ STL make_heap 和priority_queue 给出不同的输出

string - 在 Haskell 中显示没有小数位的浮点整数的简单方法?