Rust 中 f64 的最大值

nic*_*las 3 max rust

我有一个价格向量 ( f64)。我想计算最高价格。

当前计算f64in rust集合的最大值的最简单和最惯用的方法是什么?

已经有一些讨论Ordf64但我不确定什么是最新的和不那么笨拙的方法。

我依赖以下,但我想有一些内置的操作

let max = prices.iter().fold(None, |r, &n| match r {
    Some(p) => Some(f64::max(p, n)),
    None => Some(e),
});
Run Code Online (Sandbox Code Playgroud)

(这只是一些自由幺半群的折叠)

小智 9

从 Rust 1.43 开始,你可以这样写:

my_iterator.fold(f64::NEG_INFINITY, f64::max)
Run Code Online (Sandbox Code Playgroud)

说明:用作f64::NEG_INFINITY初始值,因为它是操作的中性元素f64::max

  • 当迭代器为空时,负无穷大将影响代码的其余部分。根据具体情况,这可能没问题,也可能会给下游处理带来问题。我以前写过这样的代码,但重要的是要确保对结果进行的数字运算不会因无穷大而窒息。Jason 的答案也有同样的问题,但 NaN 往往比无穷大更具传染性,并且以更明显的方式失败,因此如果预计迭代器永远不会为空,那可能会更好。 (3认同)

Pet*_*all 6

另一种解决方案是使用流行的ordered-floatcrate,允许您使用内置Iterator::max方法:

use ordered_float::NotNan; // 2.0.0

let max = arr
    .iter()
    .copied()
    .map(NotNan::new)
    .flatten() // ignore NAN values (errors from the previous line)
    .max()
    .map(NotNan::into_inner);
Run Code Online (Sandbox Code Playgroud)

这本质上与您为从整数数组中查找最大值而编写的惯用代码相同:

let max = arr.iter().copied().max();
Run Code Online (Sandbox Code Playgroud)

不同之处在于它NotNan在每个值周围添加了一个包装器,该包装器实现了Ord. 找到结果后,它会解开值以获取内部浮点数。您可以将此模式应用于大多数使用整数的现有代码,以将其更新为使用浮点数。


Jas*_*son 5

我不知道这样做的不同方法,但我过去使用过以下方法:

let arr = [1.0, -42.0, 0.0, -5.0, 42.0, 7.0];
let max = arr.iter().copied().fold(f64::NAN, f64::max) // 42.0
Run Code Online (Sandbox Code Playgroud)


bet*_*ros 5

作为另一种选择:它仍然不稳定/只在夜间使用,但是在 f32 和 f64 上有一个total_cmp方法可以与max_by 一起使用。

arr.iter().max_by(|a, b| a.total_cmp(b))
Run Code Online (Sandbox Code Playgroud)

铁锈游乐场

  • 看起来total_cmp刚刚获得批准,所以它可能会在1.59中 (2认同)