fixed rounding rescaling

This commit is contained in:
Jean-Philippe Bossuat
2025-01-08 11:06:56 +01:00
parent 3db800f4ce
commit bdd57b91ed
13 changed files with 649 additions and 362 deletions

34
math/src/num_bigint.rs Normal file
View File

@@ -0,0 +1,34 @@
use num_bigint::BigInt;
use num_bigint::Sign;
use num_integer::Integer;
use num_traits::{Zero, One, Signed};
pub trait Div{
fn div_floor(&self, other: &Self) -> Self;
fn div_round(&self, other: &Self) -> Self;
}
impl Div for BigInt{
fn div_floor(&self, other:&Self) -> Self{
let quo: BigInt = self / other;
if self.sign() == Sign::Minus {
return quo - BigInt::one()
}
return quo
}
fn div_round(&self, other:&Self) -> Self{
let (quo, mut rem) = self.div_rem(other);
rem <<= 1;
if rem != BigInt::zero() && &rem.abs() > other{
if self.sign() == other.sign(){
return quo + BigInt::one()
}else{
return quo - BigInt::one()
}
}
return quo
}
}