cordic sqrt
This commit is contained in:
parent
446de71c30
commit
9f6dffafda
@ -9,11 +9,15 @@ pub struct Fixed<const CHUNKS:usize,Frac>{
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl<const CHUNKS:usize,Frac:Unsigned> Fixed<CHUNKS,Frac>{
|
impl<const CHUNKS:usize,Frac:Unsigned> Fixed<CHUNKS,Frac>{
|
||||||
pub const ZERO:Self=Self{bits:BInt::<CHUNKS>::ZERO,frac:PhantomData};
|
|
||||||
pub const ONE:Self=Self{bits:BInt::<CHUNKS>::ONE.shl(Frac::U32),frac:PhantomData};
|
|
||||||
pub const NEG_ONE:Self=Self{bits:BInt::<CHUNKS>::NEG_ONE.shl(Frac::U32),frac:PhantomData};
|
|
||||||
pub const MAX:Self=Self{bits:BInt::<CHUNKS>::MAX,frac:PhantomData};
|
pub const MAX:Self=Self{bits:BInt::<CHUNKS>::MAX,frac:PhantomData};
|
||||||
pub const MIN:Self=Self{bits:BInt::<CHUNKS>::MIN,frac:PhantomData};
|
pub const MIN:Self=Self{bits:BInt::<CHUNKS>::MIN,frac:PhantomData};
|
||||||
|
pub const ZERO:Self=Self{bits:BInt::<CHUNKS>::ZERO,frac:PhantomData};
|
||||||
|
pub const ONE:Self=Self{bits:BInt::<CHUNKS>::ONE.shl(Frac::U32),frac:PhantomData};
|
||||||
|
pub const TWO:Self=Self{bits:BInt::<CHUNKS>::TWO.shl(Frac::U32),frac:PhantomData};
|
||||||
|
pub const HALF:Self=Self{bits:BInt::<CHUNKS>::ONE.shl(Frac::U32-1),frac:PhantomData};
|
||||||
|
pub const NEG_ONE:Self=Self{bits:BInt::<CHUNKS>::NEG_ONE.shl(Frac::U32),frac:PhantomData};
|
||||||
|
pub const NEG_TWO:Self=Self{bits:BInt::<CHUNKS>::NEG_TWO.shl(Frac::U32),frac:PhantomData};
|
||||||
|
pub const NEG_HALF:Self=Self{bits:BInt::<CHUNKS>::NEG_ONE.shl(Frac::U32-1),frac:PhantomData};
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<const CHUNKS:usize,Frac:Unsigned,T> From<T> for Fixed<CHUNKS,Frac>
|
impl<const CHUNKS:usize,Frac:Unsigned,T> From<T> for Fixed<CHUNKS,Frac>
|
||||||
@ -148,3 +152,50 @@ impl_shift_assign_operator!( Fixed, ShlAssign, shl_assign );
|
|||||||
impl_shift_operator!( Fixed, Shl, shl, Self );
|
impl_shift_operator!( Fixed, Shl, shl, Self );
|
||||||
impl_shift_assign_operator!( Fixed, ShrAssign, shr_assign );
|
impl_shift_assign_operator!( Fixed, ShrAssign, shr_assign );
|
||||||
impl_shift_operator!( Fixed, Shr, shr, Self );
|
impl_shift_operator!( Fixed, Shr, shr, Self );
|
||||||
|
|
||||||
|
impl<const CHUNKS:usize,Frac:Unsigned> Fixed<CHUNKS,Frac>{
|
||||||
|
pub fn sqrt_unchecked(self)->Self{
|
||||||
|
let mut pow2=if self==Self::ZERO{
|
||||||
|
return Self::ZERO;
|
||||||
|
}else if self<Self::ONE{
|
||||||
|
//find pow2 more powerful than self
|
||||||
|
let mut pow2=Self::ONE;
|
||||||
|
while self<=pow2{
|
||||||
|
pow2>>=1;
|
||||||
|
}
|
||||||
|
pow2
|
||||||
|
}else if self==Self::ONE{
|
||||||
|
return Self::ONE;
|
||||||
|
}else{
|
||||||
|
//find pow2 more powerful than self
|
||||||
|
let mut pow2=Self::ONE;
|
||||||
|
while pow2<=self{
|
||||||
|
pow2<<=1;
|
||||||
|
}
|
||||||
|
pow2
|
||||||
|
};
|
||||||
|
let mut result=pow2;
|
||||||
|
while pow2!=Self::ZERO{
|
||||||
|
pow2>>=1;
|
||||||
|
let new_result=result+pow2;
|
||||||
|
if new_result*new_result<=self{
|
||||||
|
result=new_result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
result
|
||||||
|
}
|
||||||
|
pub fn sqrt(self)->Self{
|
||||||
|
if self<Self::ZERO{
|
||||||
|
panic!("Square root less than zero")
|
||||||
|
}else{
|
||||||
|
self.sqrt_unchecked()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pub fn sqrt_checked(self)->Option<Self>{
|
||||||
|
if self<Self::ZERO{
|
||||||
|
None
|
||||||
|
}else{
|
||||||
|
Some(self.sqrt_unchecked())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -12,3 +12,9 @@ fn test_bint(){
|
|||||||
let a=crate::types::I32F32::ONE;
|
let a=crate::types::I32F32::ONE;
|
||||||
assert_eq!(a*2,crate::types::I32F32::from(2));
|
assert_eq!(a*2,crate::types::I32F32::from(2));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_sqrt(){
|
||||||
|
let a=crate::types::I32F32::ONE*4;
|
||||||
|
assert_eq!(a.sqrt(),crate::types::I32F32::from(2));
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user