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 OperableDouble extends OperableNumber
27 {
28 private static final long serialVersionUID = 3613491343405207027L;
29 public static final OperableDouble ZERO = new OperableDouble(0.0);
30 public static final OperableDouble ONE = new OperableDouble(1.0);
31
32 private final double number;
33
34 public OperableDouble(final double n)
35 {
36 number = n;
37 }
38
39 public OperableDouble(final String val)
40 {
41 number = Double.parseDouble(val);
42 }
43
44
45 @Override
46 public OperableNumber zero()
47 {
48 return ZERO;
49 }
50
51 @Override
52 public OperableNumber add(final OperableNumber addend)
53 {
54 return new OperableDouble(number + addend.doubleValue());
55 }
56
57 @Override
58 public OperableNumber subtract(final OperableNumber subtrahend)
59 {
60 return new OperableDouble(number - subtrahend.doubleValue());
61 }
62
63 @Override
64 public OperableNumber multiply(final OperableNumber multiplier)
65 {
66 return new OperableDouble(number * multiplier.doubleValue());
67 }
68
69 @Override
70 public OperableNumber divide(final OperableNumber divisor)
71 {
72 return new OperableDouble(number / divisor.doubleValue());
73 }
74
75 @Override
76 public OperableNumber mod(final OperableNumber divisor)
77 {
78 throw new UnsupportedOperationException("mod on double does not make sense");
79 }
80
81 @Override
82 public BigDecimal bigDecimalValue()
83 {
84 return BigDecimal.valueOf(number);
85 }
86
87 @Override
88 public BigInteger bigIntegerValue()
89 {
90 return BigInteger.valueOf((long)number);
91 }
92
93 @Override
94 public int compareTo(Object o)
95 {
96 double other = ((OperableNumber) o).doubleValue();
97 if (number > other)
98 {
99 return 1;
100 } else if (number == other)
101 {
102 return 0;
103 } else
104 {
105 return -1;
106 }
107 }
108
109 @Override
110 public Type getType()
111 {
112 return Type.REAL;
113 }
114
115 @Override
116 public OperableGNUBigInteger gnuBigIntegerValue() {
117 return new OperableGNUBigInteger(Double.toString(number));
118 }
119
120 @Override
121 public int intValue()
122 {
123 return (int) number;
124 }
125
126 @Override
127 public long longValue()
128 {
129 return (long) number;
130 }
131
132 @Override
133 public float floatValue()
134 {
135 return (float) number;
136 }
137
138 @Override
139 public double doubleValue()
140 {
141 return (double) number;
142 }
143
144
145
146 @Override
147 public String toString()
148 {
149 return Double.toString(number);
150 }
151
152 @Override
153 public boolean equals(Object obj)
154 {
155 if (obj == null)
156 {
157 return false;
158 }
159 if (getClass() != obj.getClass())
160 {
161 return false;
162 }
163 final OperableDouble other = (OperableDouble) obj;
164 if (this.number != other.number)
165 {
166 return false;
167 }
168 return true;
169 }
170
171 @Override
172 public int hashCode()
173 {
174 int hash = 7;
175 hash = 37 * hash + (int) (Double.doubleToLongBits(this.number) ^ (Double.doubleToLongBits(this.number) >>> 32));
176 return hash;
177 }
178
179 @Override
180 public OperableGNUBigFloat gnuBigFloatValue()
181 {
182 throw new UnsupportedOperationException("Not supported yet.");
183 }
184
185 @Override
186 public int getPrecision()
187 {
188 return 64;
189 }
190
191 @Override
192 public OperableNumber create(String val)
193 {
194 if ("0.0".equals(val))
195 return ZERO;
196 else
197 return new OperableDouble(val);
198 }
199
200 @Override
201 public ExtendedNumber one()
202 {
203 return ONE;
204 }
205
206 @Override
207 public OperableNumber convert(ExtendedNumber val)
208 {
209 return new OperableDouble(val.doubleValue());
210 }
211
212 }