This commit is contained in:
Quaternions 2023-10-12 16:41:26 -07:00
parent 10a293e789
commit 4bbd11dbb6

View File

@ -70,6 +70,12 @@ impl std::ops::Div<i64> for Time{
} }
} }
fn gcd(mut a:u64,mut b:u64)->u64{
while b!=0{
(a,b)=(b,a.rem_euclid(b));
};
a
}
#[derive(Clone,Copy,Hash)] #[derive(Clone,Copy,Hash)]
pub struct Ratio64{ pub struct Ratio64{
num:i64, num:i64,
@ -80,9 +86,9 @@ impl Ratio64{
pub const ONE:Self=Ratio64{num:1,den:unsafe{std::num::NonZeroU64::new_unchecked(1)}}; pub const ONE:Self=Ratio64{num:1,den:unsafe{std::num::NonZeroU64::new_unchecked(1)}};
pub fn new(num:i64,den:u64)->Option<Ratio64>{ pub fn new(num:i64,den:u64)->Option<Ratio64>{
match std::num::NonZeroU64::new(den){ match std::num::NonZeroU64::new(den){
Some(den)=>{ Some(_)=>{
//TODO: gcd let d=gcd(num.unsigned_abs(),den);
Some(Self{num,den}) Some(Self{num:num/d as i64,den:unsafe{std::num::NonZeroU64::new_unchecked(den/d)}})
}, },
None=>None, None=>None,
} }
@ -149,10 +155,10 @@ impl std::ops::Mul<Ratio64> for Ratio64{
#[inline] #[inline]
fn mul(self,rhs:Ratio64)->Self::Output{ fn mul(self,rhs:Ratio64)->Self::Output{
let (num,den)=(self.num*rhs.num,self.den.get()*rhs.den.get()); let (num,den)=(self.num*rhs.num,self.den.get()*rhs.den.get());
//TODO: gcd let d=gcd(num.unsigned_abs(),den);
Self{ Self{
num, num:num/d as i64,
den:unsafe{std::num::NonZeroU64::new_unchecked(den)}, den:unsafe{std::num::NonZeroU64::new_unchecked(den/d)},
} }
} }
} }