static public Number remainder(Object x, Object y){ Ops yops = ops(y); if(yops.isZero((Number) y)) throw new ArithmeticException("Divide by zero"); return ops(x).combine(yops).remainder((Number)x, (Number)y); }
static public Number quotient(Object x, Object y){ Ops yops = ops(y); if(yops.isZero((Number) y)) throw new ArithmeticException("Divide by zero"); return ops(x).combine(yops).quotient((Number)x, (Number)y); }
static public Number divide(Object x, Object y){ Ops yops = ops(y); if(yops.isZero((Number)y)) throw new ArithmeticException("Divide by zero"); return ops(x).combine(yops).divide((Number)x, (Number)y); }
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 boolean gte(Object x, Object y){ return ops(x).combine(ops(y)).gte((Number)x, (Number)y); }
static public boolean equiv(Number x, Number y){ return ops(x).combine(ops(y)).equiv(x, y); }
static public boolean lt(Object x, Object y){ return ops(x).combine(ops(y)).lt((Number)x, (Number)y); }
static public Number multiply(Object x, Object y){ return ops(x).combine(ops(y)).multiply((Number)x, (Number)y); }
static public Number addP(Object x, Object y){ return ops(x).combine(ops(y)).addP((Number)x, (Number)y); }
static public Number add(Object x, Object y){ return ops(x).combine(ops(y)).add((Number)x, (Number)y); }
static public boolean gt(Object x, Object y){ return ops(x).combine(ops(y)).lt((Number)y, (Number)x); }
static public Number multiplyP(Object x, Object y){ return ops(x).combine(ops(y)).multiplyP((Number)x, (Number)y); }
static public boolean lte(Object x, Object y){ return ops(x).combine(ops(y)).lte((Number)x, (Number)y); }
static public Number minus(Object x, Object y){ Ops yops = ops(y); return ops(x).combine(yops).add((Number)x, yops.negate((Number)y)); }
static public Number minusP(Object x, Object y){ Ops yops = ops(y); Number negativeY = yops.negateP((Number) y); Ops negativeYOps = ops(negativeY); return ops(x).combine(negativeYOps).addP((Number)x, negativeY); }
static public boolean equal(Number x, Number y){ return category(x) == category(y) && ops(x).combine(ops(y)).equiv(x, y); }
static public int compare(Number x, Number y){ Ops ops = ops(x).combine(ops(y)); if(ops.lt(x, y)) return -1; else if(ops.lt(y, x)) return 1; return 0; }
static public int compare(Number x, Number y){ Ops ops = ops(x).combine(ops(y)); if(ops.lt(x, y)) return -1; else if(ops.lt(y, x)) return 1; return 0; }