BTreeMap中的Float键用于Rust中的二进制搜索

问题描述 投票:0回答:1

我想从ordered集合中找到第一个大于限制的元素。尽管迭代总是一个选择,但我需要一个更快的选择。目前,我想出了一个类似this的解决方案,但感觉有点不客气:

use std::collections::BTreeMap;
use std::cmp::Ordering;
use std::ops::Bound::{Included, Unbounded};

#[derive( Debug)]
struct FloatWrapper(f32);

impl Eq for FloatWrapper { }

impl PartialEq for FloatWrapper {
    fn eq(&self, other: &Self) -> bool {
        (self.0 - other.0).abs() < 1.17549435e-36f32
    }
}

impl Ord for FloatWrapper {
    fn cmp(&self, other: &Self) -> Ordering {
        if (self.0 - other.0).abs() < 1.17549435e-36f32 {
            Ordering::Equal
        } else if self.0 - other.0 > 0.0 {
            Ordering::Greater
        } else if self.0 - other.0 < 0.0 {
            Ordering::Less
        } else {
            Ordering::Equal
        }

    }
}

impl PartialOrd for FloatWrapper {
    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
        Some(self.cmp(other))
    }
}
  • 浮点数包装不好,即使我确定不会有NaN]]

  • 该范围也是不必要的,因为我想要一个元素。

  • 您知道仅使用Rust的标准库来获得类似结果的更好方法吗?我知道有很多树实现,但是感觉有点过大了。

我想从有序集合中找到第一个大于限制的元素。尽管迭代总是一个选择,但我需要一个更快的选择。目前,我想出了一个解决方案...

rust floating-point
1个回答
0
投票

现在我们已经过了,并澄清了一些要求,对您来说有两个坏消息:

© www.soinside.com 2019 - 2024. All rights reserved.