pub fn about_eq(a: f32, b: f32, granularity: f32) -> bool {
f32_about_eq_snap(a, granularity) == f32_about_eq_snap(b, granularity)
}
pub fn about_eq_hash<H: std::hash::Hasher>(f: f32, granularity: f32, state: &mut H) {
use std::hash::Hash;
f32_about_eq_snap(f, granularity).hash(state);
}
fn f32_about_eq_snap(f: f32, granularity: f32) -> (u8, i64) {
let (kind, bucket) = if f.is_nan() {
(255u8, 0i64)
} else if f.is_infinite() {
if f.is_sign_positive() { (254, 0) } else { (1, 0) }
} else {
let bucket = (f / granularity).floor() as i64;
(128, bucket)
};
(kind, bucket)
}
pub fn about_eq_ord(a: f32, b: f32, granularity: f32) -> std::cmp::Ordering {
let a = f32_about_eq_snap(a, granularity);
let b = f32_about_eq_snap(b, granularity);
a.cmp(&b)
}
pub const EQ_GRANULARITY: f32 = 0.00001;
pub const EQ_GRANULARITY_100: f32 = 0.001;