smarter sqrt
This commit is contained in:
parent
3d3eb966a4
commit
8ba76c7a00
@ -289,25 +289,17 @@ impl<const CHUNKS:usize,Frac:Unsigned> Fixed<CHUNKS,Frac>
|
|||||||
Fixed::<CHUNKS,Frac>:std::ops::Mul<Fixed<CHUNKS,Frac>,Output=Fixed<CHUNKS,Frac>>,
|
Fixed::<CHUNKS,Frac>:std::ops::Mul<Fixed<CHUNKS,Frac>,Output=Fixed<CHUNKS,Frac>>,
|
||||||
{
|
{
|
||||||
pub fn sqrt_unchecked(self)->Self{
|
pub fn sqrt_unchecked(self)->Self{
|
||||||
//find pow2 more powerful than self
|
//pow2 must be the minimum power of two which when squared is greater than self
|
||||||
let mut pow2=if Self::ONE<self{
|
//0001.0000 Fixed<u8,4>
|
||||||
let mut pow2=Self::TWO;//1<self is so bake one iteration
|
//sqrt
|
||||||
while pow2<=self{
|
//0110.0000
|
||||||
pow2<<=1;
|
//pow2 = 0100.0000
|
||||||
}
|
let mut pow2=Self{
|
||||||
pow2
|
bits:BInt::<CHUNKS>::ONE.shl((((CHUNKS as i32*64-Frac::I32-(self.bits.leading_zeros() as i32)+1)>>1)+Frac::I32) as u32),
|
||||||
}else if Self::ONE==self{
|
frac:PhantomData,
|
||||||
return Self::ONE;
|
|
||||||
}else if Self::ZERO<self{
|
|
||||||
let mut pow2=Self::ONE;
|
|
||||||
while self<=pow2{
|
|
||||||
pow2>>=1;
|
|
||||||
}
|
|
||||||
pow2
|
|
||||||
}else{//either 0==self or self is negative
|
|
||||||
return Self::ZERO;
|
|
||||||
};
|
};
|
||||||
let mut result=pow2;
|
let mut result=pow2>>1;
|
||||||
|
|
||||||
while pow2!=Self::ZERO{
|
while pow2!=Self::ZERO{
|
||||||
pow2>>=1;
|
pow2>>=1;
|
||||||
let new_result=result+pow2;
|
let new_result=result+pow2;
|
||||||
|
Loading…
Reference in New Issue
Block a user