[英]max of f64 in Rust
我有一個價格向量( f64
)。 我想計算最高價格。
計算 rust 中f64
集合的最大值的當前最簡單和最慣用的方法是什么?
已經有一些關於Ord
和f64
的討論,但我不確定什么是最新且不那么老套的方法。
我依賴以下內容,但我想象有一些內置操作
let max = prices.iter().fold(None, |r, &n| match r {
Some(p) => Some(f64::max(p, n)),
None => Some(e),
});
(這只是一些免費的幺半群的折疊)
我不知道這樣做的不同方法,但我過去使用過以下方法:
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
從 Rust 1.43 開始,你可以這樣寫:
my_iterator.fold(f64::NEG_INFINITY, f64::max)
說明:使用f64::NEG_INFINITY
作為初始值,因為它是f64::max
操作的中性元素。
另一種解決方案是使用流行的ordered-float
crate ,允許您使用內置的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);
這與您編寫的用於從整數數組中查找最大值的慣用代碼基本相同:
let max = arr.iter().copied().max();
不同之處在於它在每個值周圍添加了一個NotNan
包裝器,它實現了Ord
。 找到結果后,它會解開值以獲取內部浮點數。 您可以將此模式應用於大多數使用整數的現有代碼,以將其更新為使用浮點數。
這是一種使用實際向量且無需復制操作的簡潔方法:
fn main() {
let v: Vec<f64> = vec![-2.2, -7.7, -3.3];
let max = v
.iter()
.fold(f64::NEG_INFINITY, |prev, curr| prev.max(*curr));
assert!(max == -2.2);
println!("{}", max);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.