From 27f745ee6d2f9d3e4d28a5b8b1b28f97db4dff08 Mon Sep 17 00:00:00 2001 From: Hexa Dust Date: Fri, 18 Jul 2025 21:19:30 +0100 Subject: [PATCH] assert significant is valid --- src/lib.rs | 37 ++++++++++++++++++++++++++++++------- 1 file changed, 30 insertions(+), 7 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index bd59c63..de2e8c4 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -23,14 +23,35 @@ impl Display for DecimalError { #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub struct Decimal { - pub minus: bool, - pub significant: [u8; SIZE], - pub minus_exponent: bool, - pub exponent: EXP, + minus: bool, + significant: [u8; SIZE], + minus_exponent: bool, + exponent: EXP, } impl Decimal { - pub fn from_float(mut f: F) -> Result, DecimalError> { + pub fn new(minus: bool, significant: [u8; SIZE], minus_exponent: bool, exponent: EXP) -> Self { + for s in significant { + assert!(s < 10, "bad significant"); + } + Decimal { + minus, + significant, + minus_exponent, + exponent, + } + } + + pub fn into_parts(self) -> (bool, [u8; SIZE], bool, EXP) { + ( + self.minus, + self.significant, + self.minus_exponent, + self.exponent, + ) + } + + pub fn from_float(mut f: F) -> Result { if !f.is_finite() { return Err(DecimalError::NotANumber); } @@ -57,10 +78,12 @@ impl Decimal { } let mut significant = [0; SIZE]; for i in 0..SIZE { - let s = f.trunc().to_u8().unwrap(); + let mut s = f.trunc().to_u8().unwrap(); + if s >= 10 { + s = 9; + } f = f * F::from(10).unwrap(); f = f - F::from(s * 10).ok_or(DecimalError::ExponentOverflow)?; - debug_assert!(s < 10); significant[i] = s; } Ok(Decimal {