mirror of
https://github.com/arnaucube/poulpy.git
synced 2026-02-10 13:16:44 +01:00
fixed rounding rescaling
This commit is contained in:
34
math/src/num_bigint.rs
Normal file
34
math/src/num_bigint.rs
Normal 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
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user