我有一个价格向量 ( f64)。我想计算最高价格。
当前计算f64in rust集合的最大值的最简单和最惯用的方法是什么?
已经有一些讨论Ord,f64但我不确定什么是最新的和不那么笨拙的方法。
我依赖以下,但我想有一些内置的操作
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。
另一种解决方案是使用流行的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. 找到结果后,它会解开值以获取内部浮点数。您可以将此模式应用于大多数使用整数的现有代码,以将其更新为使用浮点数。
我不知道这样做的不同方法,但我过去使用过以下方法:
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)
作为另一种选择:它仍然不稳定/只在夜间使用,但是在 f32 和 f64 上有一个total_cmp方法可以与max_by 一起使用。
arr.iter().max_by(|a, b| a.total_cmp(b))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
792 次 |
| 最近记录: |