diff --git a/lib/fixed_wide/src/fixed.rs b/lib/fixed_wide/src/fixed.rs index 8cb266e39..f627ee717 100644 --- a/lib/fixed_wide/src/fixed.rs +++ b/lib/fixed_wide/src/fixed.rs @@ -33,6 +33,14 @@ impl<const N:usize,const F:usize> Fixed<N,F>{ self.bits } #[inline] + pub const fn as_bits(&self)->&BInt<N>{ + &self.bits + } + #[inline] + pub const fn as_bits_mut(&mut self)->&mut BInt<N>{ + &mut self.bits + } + #[inline] pub const fn raw_digit(value:i64)->Self{ let mut digits=[0u64;N]; digits[0]=value.abs() as u64; @@ -788,13 +796,10 @@ macro_rules! impl_not_const_generic{ let wide_self=self.[<fix_ $_2n>](); //descend down the bits and check if flipping each bit would push the square over the input value for shift in (0..=max_shift).rev(){ - let new_result={ - let mut bits=result.to_bits().to_bits(); - bits.set_bit(shift,true); - Self::from_bits(BInt::from_bits(bits)) - }; - if new_result.[<wide_mul_ $n _ $n>](new_result)<=wide_self{ - result=new_result; + result.as_bits_mut().as_bits_mut().set_bit(shift,true); + if wide_self<result.[<wide_mul_ $n _ $n>](result){ + // put it back lol + result.as_bits_mut().as_bits_mut().set_bit(shift,false); } } result