From ff731505c0e82697c224b1da381ad7feafa25990 Mon Sep 17 00:00:00 2001 From: numzero Date: Sun, 2 Nov 2025 01:26:06 +0300 Subject: [PATCH] two-way conversion --- src/lib.rs | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 29e6095..c7d1846 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -4,6 +4,11 @@ const E_MAX: u8 = 4; static_assertions::const_assert_eq!(M_BITS + E_BITS, 8); +pub const EXACT_INT_MAX: u8 = if E_MAX > M_BITS { + 2 << M_BITS +} else { + (2 << E_MAX) - 1 +}; const M_STORAGE_MAX: u8 = (1 << M_BITS) - 1; const E_STORAGE_MAX: u8 = (1 << E_BITS) - 1; const M_BIAS: u8 = 1 << M_BITS; @@ -35,8 +40,17 @@ impl F8 { } impl From for F8 { - fn from(value: u8) -> Self { - todo!() + fn from(v: u8) -> Self { + if v == 0 { + return Self(0); + } + let e = v.ilog2() as u8; + let off = e as i8 - M_BITS as i8; + let m = if off >= 0 { v >> off } else { v << -off }; + if e > E_MAX { + return Self(0xff); + } + Self::merge(m & M_STORAGE_MAX, e + E_BIAS) } } @@ -60,5 +74,8 @@ mod tests { for e in 0..E_MAX { assert_eq!(u8::from(F8::merge(0, e + E_BIAS)), 1 << e, "e={e}"); } + for k in 0..=EXACT_INT_MAX { + assert_eq!(u8::from(F8::from(k)), k); + } } }