31 lines
1008 B
Plaintext
31 lines
1008 B
Plaintext
class Rational{ // Weenie Rational class, can handle BigInts
|
|
fcn init(_a,_b){ var a=_a, b=_b; normalize(); }
|
|
fcn toString{
|
|
if(b==1) a.toString()
|
|
else "%d//%d".fmt(a,b)
|
|
}
|
|
var [proxy] isZero=fcn{ a==0 };
|
|
fcn normalize{ // divide a and b by gcd
|
|
g:= a.gcd(b);
|
|
a/=g; b/=g;
|
|
if(b<0){ a=-a; b=-b; } // denominator > 0
|
|
self
|
|
}
|
|
fcn abs { a=a.abs(); self }
|
|
fcn __opNegate{ a=-a; self } // -Rat
|
|
fcn __opAdd(n){
|
|
if(Rational.isChildOf(n)) self(a*n.b + b*n.a, b*n.b); // Rat + Rat
|
|
else self(b*n + a, b); // Rat + Int
|
|
}
|
|
fcn __opSub(n){ self(a*n.b - b*n.a, b*n.b) } // Rat - Rat
|
|
fcn __opMul(n){
|
|
if(Rational.isChildOf(n)) self(a*n.a, b*n.b); // Rat * Rat
|
|
else self(a*n, b); // Rat * Int
|
|
}
|
|
fcn __opDiv(n){ self(a*n.b,b*n.a) } // Rat / Rat
|
|
fcn __opEQ(r){ // Rat==Rat, Rat==n
|
|
if(Rational.isChildOf(r)) a==r.a and b=r.b;
|
|
else b==1 and a==r;
|
|
}
|
|
}
|