#total #float #hash #comparison #floating-point #data-structures

no-std total_float_wrap

根据IEEE 754 totalOrd实现Hash和Ord的浮点数包装器

2个版本

0.1.1 2022年1月21日
0.1.0 2022年1月21日

#2258 in Rust模式

MIT/Apache

31KB
522

total_float_wrap

围绕Rust的浮点数类型进行包装,提供完全排序和哈希功能,允许其在哈希表等数据结构中使用。此包装器的排序与IEEE 754 totalOrd一致。

示例代码

以下是使用TotalF64作为哈希表键的示例代码,可以使用cargo run --example hashmap运行。

use std::collections::HashMap;
use total_float_wrap::TotalF64;

fn main() {
    let mut triangles: HashMap<TotalF64, Vec<(u32, u32)>> = Default::default();

    let start_adj = 1;
    let end_adj = 10;
    let start_opp = 1;
    let end_opp = 30;

    for adjacent in start_adj..=end_adj {
        for opposite in start_opp..=end_opp {
            triangles
                .entry(f64::atan2(adjacent.into(), opposite.into()).into())
                .or_default()
                .push((adjacent, opposite));
        }
    }

    let (_, vals) = triangles.iter().max_by_key(|v| v.1.len()).unwrap();
    
    println!("For the triangles in the square of points [{start_adj}..{end_adj}]x[{start_opp}..{end_opp}]");
    for (TotalF64(angle), group) in triangles.iter().filter(|v| v.1.len() == vals.len()) {
        println!("The group {group:?} has the maximal members");
        println!(
            "- with an angle of {:.2}° - a ratio of {:.5} between the opposite and the adjacent.",
            angle.to_degrees(), angle.tan()
        );
    }
}

无运行时依赖