, , + Ratio s, . +:
([x y] (. clojure.lang.Numbers (add x y)))
Numbers.add(Obj, Obj):
return ops(x).combine(ops(y)).add((Number)x, (Number)y);
ops RatioOps. RatioOps.add:
final public Number add(Number x, Number y){
Ratio rx = toRatio(x);
Ratio ry = toRatio(y);
Number ret = divide(ry.numerator.multiply(rx.denominator)
.add(rx.numerator.multiply(ry.denominator))
, ry.denominator.multiply(rx.denominator));
return normalizeRet(ret, x, y);
}
, . BigInteger ( , , ):
(yn*xd + xn*yd) / (xd*yd)
, ; , .
, div gcd , :
static public Number divide(BigInteger n, BigInteger d){
if(d.equals(BigInteger.ZERO))
throw new ArithmeticException("Divide by zero");
BigInteger gcd = n.gcd(d);
if(gcd.equals(BigInteger.ZERO))
return BigInt.ZERO;
n = n.divide(gcd);
d = d.divide(gcd);
...
}
gcd MutableBigInteger.
, , . ( gcd ), , .
double , FWIW, BigDecimal s.
, , . , , .