From 3056efc1a23224d2bc6cfd34ddd6a813d293f896 Mon Sep 17 00:00:00 2001 From: numzero Date: Sun, 2 Nov 2025 15:08:43 +0300 Subject: [PATCH] add public API --- src/conv.rs | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/conv.rs b/src/conv.rs index 8472df9..4bd0660 100644 --- a/src/conv.rs +++ b/src/conv.rs @@ -73,6 +73,33 @@ impl F8 { } Self::merge(m as u8 & M_STORAGE_MAX, e as u8) } + + pub fn from_bits(bits: u8) -> Self { + Self(bits) + } + + pub fn to_bits(self) -> u8 { + self.0 + } + + /// Calculate `base * 2.pow(scale)`, preserving as much precision as possible. + pub fn ldexp(base: u32, scale: i32) -> Self { + Self::merge_unbias(base, scale) + } + + /// Split `self` into `(base, scale)` such that `self = base * 2.pow(scale)`. + /// + /// ``` + /// # use f8::F8; + /// # let val = F8::from_bits(42); + /// let (base, scale) = val.frexp(); + /// let val2 = F8::ldexp(base, scale); + /// assert_eq!(val, val2); + /// ``` + pub fn frexp(self) -> (u32, i32) { + let (base, scale) = self.split_unbias(); + (base.into(), scale.into()) + } } #[cfg(test)]