@Override public IExpr median(IAST dist) { IExpr[] minMax = minmax(dist); if (minMax != null) { IExpr l = minMax[0]; IExpr r = minMax[1]; // (l,r) => -1 + l + Max(1, Ceiling((1/2)*(1 - l + r))) return F.Plus(F.CN1, l, F.Max(F.C1, F.Ceiling(F.Times(F.C1D2, F.Plus(F.C1, F.Negate(l), r))))); } return F.NIL; }
/** * Returns the smallest (closest to negative infinity) <code>ISignedNumber</code> value that is not less than * <code>this</code> and is equal to a mathematical integer. * * See <a href="http://en.wikipedia.org/wiki/Floor_and_ceiling_functions">Wikipedia - Floor and ceiling * functions</a> * */ @Override public IExpr evaluate(final IAST ast, EvalEngine engine) { Validate.checkRange(ast, 2, 3); try { if (ast.isAST2()) { return F.Times(F.Ceiling(F.Divide(ast.arg1(), ast.arg2())), ast.arg2()); } IExpr arg1 = engine.evaluateNull(ast.arg1()); if (arg1.isPresent()) { return evalCeiling(arg1).orElse(F.Ceiling(arg1)); } return evalCeiling(ast.arg1()); } catch (ArithmeticException ae) { // ISignedNumber#floor() or #ceil() may throw ArithmeticException } return F.NIL; }
public IExpr evaluate(final IAST ast) { if (ast.size() != 2) { throw new WrongNumberOfArguments(ast, 1, ast.size() - 1); } IExpr arg1 = ast.get(1); if (arg1.isSignedNumber()) { return ((ISignedNumber) arg1).ceil(); } if (arg1.isSymbol()) { ISymbol sym = (ISymbol) arg1; return sym.mapConstantDouble(new CeilingNumericFunction()); } if (arg1.isPlus()) { IAST[] result = ((IAST) arg1).split(new CeilingPlusFunction()); if (result[0].size() > 1) { if (result[1].size() > 1) { result[0].add(F.Ceiling(result[1])); } return result[0]; } } return null; }
public IExpr evalCeiling(IExpr arg1) { if (arg1.isNumber()) { return ((INumber) arg1).ceilFraction(); } INumber number = arg1.evalNumber(); if (number != null) { return number.ceilFraction(); } if (arg1.isIntegerResult()) { return arg1; } if (arg1.isPlus()) { IASTAppendable[] splittedPlus = ((IAST) arg1).filter(new CeilingPlusFunction()); if (splittedPlus[0].size() > 1) { if (splittedPlus[1].size() > 1) { splittedPlus[0].append(F.Ceiling(splittedPlus[1].getOneIdentity(F.C0))); } return splittedPlus[0]; } } IExpr negExpr = AbstractFunctionEvaluator.getNormalizedNegativeExpression(arg1); if (negExpr.isPresent()) { return Negate(Floor(negExpr)); } return F.NIL; }
public IExpr evalFloor(IExpr arg1) { if (arg1.isNumber()) { return ((INumber) arg1).floorFraction(); } INumber number = arg1.evalNumber(); if (number != null) { return number.floorFraction(); } if (arg1.isIntegerResult()) { return arg1; } if (arg1.isPlus()) { IASTAppendable[] splittedPlus = ((IAST) arg1).filter(new FloorPlusFunction()); if (splittedPlus[0].size() > 1) { if (splittedPlus[1].size() > 1) { splittedPlus[0].append(F.Floor(splittedPlus[1].getOneIdentity(F.C0))); } return splittedPlus[0]; } } IExpr negExpr = AbstractFunctionEvaluator.getNormalizedNegativeExpression(arg1); if (negExpr.isPresent()) { return Negate(Ceiling(negExpr)); } return F.NIL; }