@Override public Number combine(Number val1, Number val2) { return Numbers.add(val1, val2); }
public int compareTo(Object o){ Number other = (Number)o; return Numbers.compare(this, other); } }
long rangeCount(long start, long end, long step) { // (1) count = ceiling ( (end - start) / step ) // (2) ceiling(a/b) = (a+b+o)/b where o=-1 for positive stepping and +1 for negative stepping // thus: count = end - start + step + o / step return Numbers.add(Numbers.add(Numbers.minus(end, start), step), this.step > 0 ? -1 : 1) / step; }
public static ISeq create(final Object start, Object end, Object step) { if((Numbers.isPos(step) && Numbers.gt(start, end)) || (Numbers.isNeg(step) && Numbers.gt(end, start)) || Numbers.equiv(start, end)) return PersistentList.EMPTY; if(Numbers.isZero(step)) return Repeat.create(start); return new Range(start, end, step, Numbers.isPos(step)?positiveStep(end):negativeStep(end)); }
return Numbers.num(0); return BigInt.fromBigInteger(bn); return bn.bitLength() < 64 ? Numbers.num(bn.longValue()) : BigInt.fromBigInteger(bn); if (numerator.startsWith("+")) numerator = numerator.substring(1); return Numbers.divide(Numbers.reduceBigInt(BigInt.fromBigInteger(new BigInteger(numerator))), Numbers.reduceBigInt(BigInt.fromBigInteger(new BigInteger(m.group(2)))));
public Number remainder(Number x, Number y){ Ratio rx = toRatio(x); Ratio ry = toRatio(y); BigInteger q = rx.numerator.multiply(ry.denominator).divide( rx.denominator.multiply(ry.numerator)); Number ret = Numbers.minus(x, Numbers.multiply(q, y)); return normalizeRet(ret, x, y); }
static public boolean equiv(long x, Object y){ return equiv((Object)x,y); }
static public Number rationalize(Number x){ if(x instanceof Float || x instanceof Double) return rationalize(BigDecimal.valueOf(x.doubleValue())); else if(x instanceof BigDecimal) { BigDecimal bx = (BigDecimal) x; BigInteger bv = bx.unscaledValue(); int scale = bx.scale(); if(scale < 0) return BigInt.fromBigInteger(bv.multiply(BigInteger.TEN.pow(-scale))); else return divide(bv, BigInteger.TEN.pow(scale)); } return x; }
static abstract class OpsP implements Ops{ public Number addP(Number x, Number y){ return add(x, y); } public Number multiplyP(Number x, Number y){ return multiply(x, y); } public Number negateP(Number x){ return negate(x); } public Number incP(Number x){ return inc(x); } public Number decP(Number x){ return dec(x); } }
static public Number divide(Object x, long y){ return divide(x,(Object)y); }
public Number divide(Number x, Number y){ return Numbers.divide(toBigInteger(x), toBigInteger(y)); }
public boolean equiv(Object k1, Object k2) { if(k2 instanceof Number) return Numbers.equal((Number) k1, (Number) k2); return false; } };
public boolean lt(Number x, Number y){ Ratio rx = toRatio(x); Ratio ry = toRatio(y); return Numbers.lt(rx.numerator.multiply(ry.denominator), ry.numerator.multiply(rx.denominator)); }