Skip to content

Commit 69e46ed

Browse files
Handles Error
1 parent ec2ffac commit 69e46ed

File tree

1 file changed

+106
-103
lines changed

1 file changed

+106
-103
lines changed
Lines changed: 106 additions & 103 deletions
Original file line numberDiff line numberDiff line change
@@ -1,103 +1,106 @@
1-
/**
2-
*
3-
*/
4-
package javacalculus.evaluator;
5-
6-
import javacalculus.core.CALC;
7-
import javacalculus.evaluator.extend.Calc1ParamFunctionEvaluator;
8-
import javacalculus.evaluator.extend.CalcOperatorEvaluator;
9-
import javacalculus.struct.CalcDouble;
10-
import javacalculus.struct.CalcFraction;
11-
import javacalculus.struct.CalcFunction;
12-
import javacalculus.struct.CalcInteger;
13-
import javacalculus.struct.CalcObject;
14-
import javacalculus.struct.CalcSymbol;
15-
16-
/**
17-
* Factorial evaluator (x! = x*(x-1)*(x-2)*...*1). Supports negative numbers.
18-
* @author Duyun Chen <A HREF="mailto:[email protected]">[[email protected]]</A>,
19-
* Seth Shannin <A HREF="mailto:[email protected]">[[email protected]]</A>
20-
*
21-
*
22-
*/
23-
public class CalcFACTORIAL extends Calc1ParamFunctionEvaluator implements CalcOperatorEvaluator {
24-
25-
@Override
26-
protected CalcObject evaluateObject(CalcObject input) {
27-
return null;
28-
}
29-
30-
@Override
31-
protected CalcObject evaluateDouble(CalcDouble input) {
32-
//use the generalized function GAMMA to evaluate doubles and fractions
33-
return CALC.GAMMA.createFunction(input.add(CALC.D_ONE));
34-
}
35-
36-
@Override
37-
protected CalcObject evaluateFraction(CalcFraction input) {
38-
return CALC.GAMMA.createFunction(input.add(new CalcFraction(CALC.ONE, CALC.ONE)));
39-
}
40-
41-
@Override
42-
protected CalcObject evaluateFunction(CalcFunction input) {
43-
return CALC.FACTORIAL.createFunction(input);
44-
}
45-
46-
@Override
47-
protected CalcObject evaluateInteger(CalcInteger input) {
48-
return factorial(input);
49-
}
50-
51-
@Override
52-
protected CalcObject evaluateSymbol(CalcSymbol input) {
53-
//cannot evaluate symbols, so just return the original function
54-
return CALC.FACTORIAL.createFunction(input);
55-
}
56-
57-
58-
public CalcInteger factorial(CalcInteger input) {
59-
60-
CalcInteger result = CALC.ONE;
61-
62-
if (input.isNegative()) {
63-
result = CALC.NEG_ONE;
64-
65-
for (CalcInteger ii = CALC.NEG_TWO; ii.compareTo(input) >= 0; ii = ii.add(CALC.NEG_ONE)) {
66-
result = result.multiply(ii);
67-
}
68-
}
69-
else {
70-
for (CalcInteger ii = CALC.TWO; ii.compareTo(input) <= 0; ii = ii.add(CALC.ONE)) {
71-
result = result.multiply(ii);
72-
}
73-
}
74-
75-
return result;
76-
}
77-
78-
@Override
79-
public int getPrecedence() {
80-
return 700;
81-
}
82-
83-
@Override
84-
public String toOperatorString(CalcFunction function) {
85-
StringBuffer buffer = new StringBuffer();
86-
char operatorChar = '!';
87-
CalcObject temp = function.get(0);
88-
89-
if (temp.getPrecedence() < getPrecedence()) {
90-
buffer.append('(');
91-
}
92-
93-
buffer.append(temp.toString());
94-
95-
if (temp.getPrecedence() < getPrecedence()) {
96-
buffer.append(')');
97-
}
98-
99-
buffer.append(operatorChar);
100-
101-
return buffer.toString();
102-
}
103-
}
1+
/**
2+
*
3+
*/
4+
package javacalculus.evaluator;
5+
6+
import javacalculus.core.CALC;
7+
import javacalculus.evaluator.extend.Calc1ParamFunctionEvaluator;
8+
import javacalculus.evaluator.extend.CalcOperatorEvaluator;
9+
import javacalculus.struct.CalcDouble;
10+
import javacalculus.struct.CalcFraction;
11+
import javacalculus.struct.CalcFunction;
12+
import javacalculus.struct.CalcInteger;
13+
import javacalculus.struct.CalcObject;
14+
import javacalculus.struct.CalcSymbol;
15+
16+
/**
17+
* Factorial evaluator (x! = x*(x-1)*(x-2)*...*1). Supports negative numbers.
18+
* @author Duyun Chen <A HREF="mailto:[email protected]">[[email protected]]</A>,
19+
* Seth Shannin <A HREF="mailto:[email protected]">[[email protected]]</A>
20+
*
21+
*
22+
*/
23+
public class CalcFACTORIAL extends Calc1ParamFunctionEvaluator implements CalcOperatorEvaluator {
24+
25+
@Override
26+
protected CalcObject evaluateObject(CalcObject input) {
27+
return null;
28+
}
29+
30+
@Override
31+
protected CalcObject evaluateDouble(CalcDouble input) {
32+
//use the generalized function GAMMA to evaluate doubles and fractions
33+
return CALC.GAMMA.createFunction(input.add(CALC.D_ONE));
34+
}
35+
36+
@Override
37+
protected CalcObject evaluateFraction(CalcFraction input) {
38+
return CALC.GAMMA.createFunction(input.add(new CalcFraction(CALC.ONE, CALC.ONE)));
39+
}
40+
41+
@Override
42+
protected CalcObject evaluateFunction(CalcFunction input) {
43+
return CALC.FACTORIAL.createFunction(input);
44+
}
45+
46+
@Override
47+
protected CalcObject evaluateInteger(CalcInteger input) {
48+
return factorial(input);
49+
}
50+
51+
@Override
52+
protected CalcObject evaluateSymbol(CalcSymbol input) {
53+
//cannot evaluate symbols, so just return the original function
54+
if (input.equals(CALC.ERROR)) {
55+
return CALC.ERROR;
56+
}
57+
return CALC.FACTORIAL.createFunction(input);
58+
}
59+
60+
61+
public CalcInteger factorial(CalcInteger input) {
62+
63+
CalcInteger result = CALC.ONE;
64+
65+
if (input.isNegative()) {
66+
result = CALC.NEG_ONE;
67+
68+
for (CalcInteger ii = CALC.NEG_TWO; ii.compareTo(input) >= 0; ii = ii.add(CALC.NEG_ONE)) {
69+
result = result.multiply(ii);
70+
}
71+
}
72+
else {
73+
for (CalcInteger ii = CALC.TWO; ii.compareTo(input) <= 0; ii = ii.add(CALC.ONE)) {
74+
result = result.multiply(ii);
75+
}
76+
}
77+
78+
return result;
79+
}
80+
81+
@Override
82+
public int getPrecedence() {
83+
return 700;
84+
}
85+
86+
@Override
87+
public String toOperatorString(CalcFunction function) {
88+
StringBuffer buffer = new StringBuffer();
89+
char operatorChar = '!';
90+
CalcObject temp = function.get(0);
91+
92+
if (temp.getPrecedence() < getPrecedence()) {
93+
buffer.append('(');
94+
}
95+
96+
buffer.append(temp.toString());
97+
98+
if (temp.getPrecedence() < getPrecedence()) {
99+
buffer.append(')');
100+
}
101+
102+
buffer.append(operatorChar);
103+
104+
return buffer.toString();
105+
}
106+
}

0 commit comments

Comments
 (0)