Crates.io | total_float_wrap |
lib.rs | total_float_wrap |
version | 0.1.1 |
source | src |
created_at | 2022-01-21 03:35:31.989923 |
updated_at | 2022-01-21 04:18:56.258729 |
description | Floating point wrapper implementing Hash and Ord according to IEEE 754 totalOrd. |
homepage | |
repository | https://github.com/tritoke/total_float_wrap |
max_upload_size | |
id | 518314 |
size | 44,223 |
A wrapper around Rust's floating point types which provides a total ordering and hashing which allows it to be used in data structures such as hashmaps etc. The ordering of this wrapper agrees with IEEE 754 totalOrd.
Below is example code using TotalF64
as the key in a hashmap, it can be run with
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()
);
}
}