1 package calculator.operations;
2
3 import java.util.List;
4
5 import calculator.Expression;
6 import calculator.IllegalConstruction;
7 import calculator.atoms.Complex;
8 import calculator.atoms.IntegerAtom;
9 import calculator.atoms.Rationnal;
10 import calculator.atoms.Real;
11
12
13
14
15
16
17
18
19
20
21
22 public final class Times extends Operation {
23
24
25
26
27
28
29
30
31 public Times(List<Expression> elist) throws IllegalConstruction {
32 super(elist);
33 symbol = "*";
34 neutral = 1;
35 }
36
37
38
39
40
41
42
43
44 public Real op(Real r1, Real r2) {
45
46 if (r1.isNan() || r2.isNan())
47 return Real.nan();
48
49
50 if (r1.getValue().doubleValue() == 0 && (r2.isPlusInf() || r2.isMinusInf()))
51 return Real.nan();
52
53 if (r2.getValue().doubleValue() == 0 && (r1.isPlusInf() || r1.isMinusInf()))
54 return Real.nan();
55
56 if (r1.isPlusInf() || r1.isMinusInf() || r2.isPlusInf() || r2.isMinusInf()) {
57
58 Double sign = r1.getValue().doubleValue() * r2.getValue().doubleValue();
59 if (sign > 0)
60 return Real.plusInf();
61 else
62 return Real.minusInf();
63 }
64 return new Real(r1.getValue().multiply(r2.getValue()));
65 }
66
67
68
69
70
71
72
73
74
75 public IntegerAtom op(IntegerAtom i1, IntegerAtom i2) {
76 return new IntegerAtom(i1.getValue() * i2.getValue());
77 }
78
79 @Override
80 public Complex op(Complex c1, Complex c2) {
81 if (c1.isNaN() || c2.isNaN()) {
82 return Complex.nan();
83 }
84 org.apache.commons.numbers.complex.Complex result = c1.getValue().multiply(c2.getValue());
85 return new Complex(result);
86 }
87
88 @Override
89 public Rationnal op(Rationnal q1, Rationnal q2) {
90 org.apache.commons.numbers.fraction.Fraction result = q1.getValue().multiply(q2.getValue());
91 return new Rationnal(result);
92 }
93 }