View Javadoc

1   /*
2    * Copyright (c) 2001, Zoltan Farkas All Rights Reserved.
3    *
4    * This library is free software; you can redistribute it and/or
5    * modify it under the terms of the GNU Lesser General Public
6    * License as published by the Free Software Foundation; either
7    * version 2.1 of the License, or (at your option) any later version.
8    *
9    * This library is distributed in the hope that it will be useful,
10   * but WITHOUT ANY WARRANTY; without even the implied warranty of
11   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12   * GNU General Public License for more details.
13   *
14   * You should have received a copy of the GNU Lesser General Public
15   * License along with this program; if not, write to the Free Software
16   * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
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 }