static class PosZeroEvaluator implements Evaluator {
private static final long serialVersionUID = 1L;
Evaluator rootEval;
Double negativeZero = -0.0;
Double positiveZero = 0.0;
public PosZeroEvaluator(Evaluator rootEval) {
super();
this.rootEval = rootEval;
}
@Override
public void init(Jep jep) {
rootEval.init(jep);
}
@Override
public JepComponent getLightWeightInstance() {
return this;
}
@Override
public Object evaluate(Node node) throws EvaluationException {
Object res = rootEval.evaluate(node);
if(res instanceof Double) {
double dval = (Double) res;
if(res.equals(negativeZero))
return positiveZero;
}
return res;
}
@Override
public Object eval(Node node) throws EvaluationException {
return rootEval.eval(node);
}
}
@Test
public void PosZeroTest() throws JepException {
// first show standard behaviour
String s = "0.0 * -1.0";
jep.parse(s);
Object res = jep.evaluate();
System.out.println(res);
assertEquals("-0.0",res.toString());
// code to use the new evaluator
jep.setComponent(new PosZeroEvaluator(new FastEvaluator()));
jep.reinitializeComponents();
// results using that evaluator
res = jep.evaluate();
System.out.println(res);
assertEquals("0.0",res.toString());
}