use std::sync::OnceLock;
pub(crate) fn signed_unit_lut() -> &'static [f32; 256] {
static LUT: OnceLock<[f32; 256]> = OnceLock::new();
LUT.get_or_init(|| {
let mut out = [0.0_f32; 256];
let mut i = 0usize;
while i < 256 {
let mut v = i as f32 * (2.0 / 255.0) - 1.0;
if v == -0.0 {
v = 0.0;
}
out[i] = v;
i += 1;
}
out
})
}
#[inline]
pub(crate) fn normalize_to_signed_unit(v: u8) -> f32 {
signed_unit_lut()[v as usize]
}
#[cfg(test)]
mod tests {
use super::signed_unit_lut;
fn reference_signed_unit(v: usize) -> f32 {
let mut out = v as f32 * (2.0 / 255.0) - 1.0;
if out == -0.0 {
out = 0.0;
}
out
}
#[test]
fn lut_matches_reference_over_the_full_input_range() {
let lut = signed_unit_lut();
assert_eq!(lut.len(), 256);
for (i, entry) in lut.iter().enumerate() {
assert_eq!(
entry.to_be_bytes(),
reference_signed_unit(i).to_be_bytes(),
"LUT entry {i} differs from the pre-merge closed form"
);
}
}
#[test]
fn lut_endpoints_and_negative_zero_normalization() {
let lut = signed_unit_lut();
assert_eq!(lut[0], -1.0);
assert_eq!(lut[255], 1.0);
assert!(lut[127] < 0.0 && lut[128] > 0.0);
for entry in lut.iter() {
assert!(
!entry.is_sign_negative() || *entry != 0.0,
"LUT must not contain -0.0"
);
}
}
#[test]
fn lut_is_a_stable_singleton_across_calls() {
let a = signed_unit_lut() as *const [f32; 256];
let b = signed_unit_lut() as *const [f32; 256];
assert!(std::ptr::eq(a, b));
}
}