#[must_use]
pub fn distance_xy(d: u16) -> f64 {
const N: u32 = 16;
let dn = f64::from(d);
let half = f64::from(1u32 << (N - 1)); dn / half - (half - 1.0) / half
}
#[must_use]
pub fn distance_z(d: u16, n: u32) -> f64 {
let dn = f64::from(d);
let max = f64::from((1u32 << n) - 1); dn / max
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn distance_xy_boundary_values() {
assert!((distance_xy(0x7FFF) - 0.0).abs() < 1e-9); assert!((distance_xy(0xFFFF) - 1.0).abs() < 1e-9); }
#[test]
fn distance_z_boundary_values() {
assert!((distance_z(0, 16) - 0.0).abs() < 1e-9);
assert!((distance_z(0xFFFF, 16) - 1.0).abs() < 1e-9);
assert!((distance_z(0, 8) - 0.0).abs() < 1e-9);
assert!((distance_z(0xFF, 8) - 1.0).abs() < 1e-9);
}
}