1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package net.sf.zel.nr;
19
20 import java.math.BigDecimal;
21 import java.math.BigInteger;
22 import javax.annotation.concurrent.Immutable;
23 import net.sf.zel.nr.ExtendedNumber.Type;
24
25 @Immutable
26 public final class OperableBigInteger extends OperableNumber
27 {
28
29 private static final long serialVersionUID = -6969840428359421648L;
30
31 public static final OperableBigInteger ZERO = new OperableBigInteger(BigInteger.valueOf(0L));
32 public static final OperableBigInteger ONE = new OperableBigInteger(BigInteger.valueOf(1L));
33
34 private final BigInteger number;
35
36 public OperableBigInteger(final BigInteger n)
37 {
38 number = n;
39 }
40
41 public OperableBigInteger(final String str)
42 {
43 number = new BigInteger(str);
44 }
45
46 @Override
47 public OperableNumber zero()
48 {
49 return ZERO;
50 }
51
52 @Override
53 public OperableNumber add(final OperableNumber addend)
54 {
55 return new OperableBigInteger(number.add(addend.bigIntegerValue()));
56 }
57
58 @Override
59 public OperableNumber subtract(final OperableNumber subtrahend)
60 {
61 return new OperableBigInteger(number.subtract(subtrahend.bigIntegerValue()));
62 }
63
64 @Override
65 public OperableNumber multiply(final OperableNumber multiplier)
66 {
67 return new OperableBigInteger(number.multiply(multiplier.bigIntegerValue()));
68 }
69
70 @Override
71 public OperableNumber divide(final OperableNumber divisor)
72 {
73 return new OperableBigInteger(number.divide(divisor.bigIntegerValue()));
74 }
75
76 @Override
77 public OperableNumber mod(final OperableNumber divisor)
78 {
79 return new OperableBigInteger(number.mod(divisor.bigIntegerValue()));
80 }
81
82 @Override
83 public BigDecimal bigDecimalValue()
84 {
85 return new BigDecimal(number);
86 }
87
88 @Override
89 public BigInteger bigIntegerValue()
90 {
91 return number;
92 }
93
94 @Override
95 public int compareTo(Object o)
96 {
97 return number.compareTo(((OperableNumber) o).bigIntegerValue());
98 }
99
100 @Override
101 public Type getType()
102 {
103 return Type.INTEGER;
104 }
105
106 @Override
107 public OperableGNUBigInteger gnuBigIntegerValue()
108 {
109 return new OperableGNUBigInteger(number.toString());
110 }
111
112 @Override
113 public int intValue()
114 {
115 return number.intValue();
116 }
117
118 @Override
119 public long longValue()
120 {
121 return number.longValue();
122 }
123
124 @Override
125 public float floatValue()
126 {
127 return number.floatValue();
128 }
129
130 @Override
131 public double doubleValue()
132 {
133 return number.doubleValue();
134 }
135
136
137 @Override
138 public String toString()
139 {
140 return number.toString();
141 }
142
143 @Override
144 public boolean equals(final Object obj)
145 {
146 if (obj == null)
147 {
148 return false;
149 }
150 if (getClass() != obj.getClass())
151 {
152 return false;
153 }
154 final OperableBigInteger other = (OperableBigInteger) obj;
155 if (this.number != other.number && (this.number == null || !this.number.equals(other.number)))
156 {
157 return false;
158 }
159 return true;
160 }
161
162 @Override
163 public int hashCode()
164 {
165 return number.hashCode();
166 }
167
168 @Override
169 public OperableGNUBigFloat gnuBigFloatValue()
170 {
171 return new OperableGNUBigFloat(number.toString());
172 }
173
174 @Override
175 public int getPrecision()
176 {
177 return number.bitCount();
178 }
179
180 @Override
181 public OperableNumber create(final String val)
182 {
183 return new OperableBigInteger(val);
184 }
185
186 @Override
187 public ExtendedNumber one()
188 {
189 return ONE;
190 }
191
192 @Override
193 public OperableNumber convert(ExtendedNumber val)
194 {
195 return new OperableBigInteger(val.bigIntegerValue());
196 }
197
198
199
200 }