Rust f64最大锈蚀量

Rust f64最大锈蚀量,rust,max,Rust,Max,我有一个价格向量(f64)。我想计算最高价格 当前计算rust中f64集合的最大值最简单、最惯用的方法是什么 关于Ord和f64有一些讨论,但我不确定什么是最新的、不太老套的方法 我依赖于以下几点,但我想象有一些内置的操作 let max=prices.iter().fold(无,| r,&n |匹配r{ Some(p)=>Some(f64::max(p,n)), 无=>部分(e), }); (这只是一些自由幺半群的折叠)我不知道这样做的不同方法,但我过去使用过以下方法: 让arr=[1.0,

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

当前计算rust中
f64
集合的最大值最简单、最惯用的方法是什么

关于
Ord
f64
有一些讨论,但我不确定什么是最新的、不太老套的方法

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

let max=prices.iter().fold(无,| r,&n |匹配r{
Some(p)=>Some(f64::max(p,n)),
无=>部分(e),
});

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

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

让arr=[1.0,-42.0,0.0,-5.0,42.0,7.0];
让max=arr.iter().copied().fold(f64::NAN,f64::max)//42.0

另一种解决方案,使用流行的,允许您使用内置的
迭代器::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);
这与从整数数组中查找最大值所编写的惯用代码基本相同:

let max = arr.iter().copied().max();

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

作为另一种选择:它仍然不稳定/仅限夜间,但在f32和f64上有一种方法可供使用


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

my_iterator.fold(f64::NEG_INFINITY, f64::max)

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

这不是您问题的答案,但是:不要通过浮点类型表示价格。有许多陷阱你永远也找不到出路。可以通过整数(例如,以美分为单位)表示价格,也可以使用全精度十进制类型。这是一个不错的建议……当迭代器为空时,负无穷大将影响代码的其余部分。取决于上下文,这可能是好的,也可能是下游处理的问题。我以前写过这样的代码,但重要的是要确保对结果所做的数字运算不会被无穷大扼杀。Jason的答案也有同样的问题,但NaN往往比无穷大更具感染力,并且以更明显的方式失败,因此如果迭代器永远不为空,这可能会更好。
my_iterator.fold(f64::NEG_INFINITY, f64::max)