簡體   English   中英

Rust 中 f64 的最大值

[英]max of f64 in Rust

我有一個價格向量( f64 )。 我想計算最高價格。

計算 rust 中f64集合的最大值的當前最簡單和最慣用的方法是什么?

已經有一些關於Ordf64的討論,但我不確定什么是最新且不那么老套的方法。

我依賴以下內容,但我想象有一些內置操作

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

作為另一種選擇:它仍然不穩定/僅夜間使用,但在 f32 和 f64 上有一個total_cmp方法,您可以將其與max_by一起使用。

arr.iter().max_by(|a, b| a.total_cmp(b))

銹操場

從 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM