Mercurial > projects > dwt2
annotate base/src/java/math/BigDecimal.d @ 98:48d4ee626868
rm databinding.observable seems to be duplicate, databinding.beans now building
author | Frank Benoit <benoit@tionex.de> |
---|---|
date | Wed, 22 Apr 2009 07:30:21 +0200 |
parents | b2d6122fa189 |
children | 9f4c18c268b2 |
rev | line source |
---|---|
82 | 1 module java.math.BigDecimal; |
2 | |
3 import java.lang.all; | |
4 import java.math.BigInteger; | |
5 | |
6 class BigDecimal : Number { | |
7 static int ROUND_CEILING; | |
8 static int ROUND_DOWN; | |
9 static int ROUND_FLOOR; | |
10 static int ROUND_HALF_DOWN; | |
11 static int ROUND_HALF_EVEN; | |
12 static int ROUND_HALF_UP; | |
13 static int ROUND_UNNECESSARY; | |
14 static int ROUND_UP; | |
15 | |
98
48d4ee626868
rm databinding.observable seems to be duplicate, databinding.beans now building
Frank Benoit <benoit@tionex.de>
parents:
82
diff
changeset
|
16 private BigInteger intVal; |
48d4ee626868
rm databinding.observable seems to be duplicate, databinding.beans now building
Frank Benoit <benoit@tionex.de>
parents:
82
diff
changeset
|
17 private int scale_; |
48d4ee626868
rm databinding.observable seems to be duplicate, databinding.beans now building
Frank Benoit <benoit@tionex.de>
parents:
82
diff
changeset
|
18 private int intCompact; |
48d4ee626868
rm databinding.observable seems to be duplicate, databinding.beans now building
Frank Benoit <benoit@tionex.de>
parents:
82
diff
changeset
|
19 private int precision; |
48d4ee626868
rm databinding.observable seems to be duplicate, databinding.beans now building
Frank Benoit <benoit@tionex.de>
parents:
82
diff
changeset
|
20 private static const MAX_BIGINT_BITS = 62; |
48d4ee626868
rm databinding.observable seems to be duplicate, databinding.beans now building
Frank Benoit <benoit@tionex.de>
parents:
82
diff
changeset
|
21 |
82 | 22 this(BigInteger val){ |
23 implMissing(__FILE__, __LINE__); | |
24 } | |
98
48d4ee626868
rm databinding.observable seems to be duplicate, databinding.beans now building
Frank Benoit <benoit@tionex.de>
parents:
82
diff
changeset
|
25 this(BigInteger unscaledVal, int scale_){ |
48d4ee626868
rm databinding.observable seems to be duplicate, databinding.beans now building
Frank Benoit <benoit@tionex.de>
parents:
82
diff
changeset
|
26 this.intVal = unscaledVal; |
48d4ee626868
rm databinding.observable seems to be duplicate, databinding.beans now building
Frank Benoit <benoit@tionex.de>
parents:
82
diff
changeset
|
27 this.scale_ = scale_; |
82 | 28 } |
29 this(double val){ | |
98
48d4ee626868
rm databinding.observable seems to be duplicate, databinding.beans now building
Frank Benoit <benoit@tionex.de>
parents:
82
diff
changeset
|
30 if (double.nan is val || double.infinity is val ) |
48d4ee626868
rm databinding.observable seems to be duplicate, databinding.beans now building
Frank Benoit <benoit@tionex.de>
parents:
82
diff
changeset
|
31 throw new NumberFormatException("Infinite or NaN"); |
48d4ee626868
rm databinding.observable seems to be duplicate, databinding.beans now building
Frank Benoit <benoit@tionex.de>
parents:
82
diff
changeset
|
32 |
48d4ee626868
rm databinding.observable seems to be duplicate, databinding.beans now building
Frank Benoit <benoit@tionex.de>
parents:
82
diff
changeset
|
33 // Translate the double into sign, exponent and significand, according |
48d4ee626868
rm databinding.observable seems to be duplicate, databinding.beans now building
Frank Benoit <benoit@tionex.de>
parents:
82
diff
changeset
|
34 // to the formulae in JLS, Section 20.10.22. |
48d4ee626868
rm databinding.observable seems to be duplicate, databinding.beans now building
Frank Benoit <benoit@tionex.de>
parents:
82
diff
changeset
|
35 long valBits = *cast(long*) & val; |
48d4ee626868
rm databinding.observable seems to be duplicate, databinding.beans now building
Frank Benoit <benoit@tionex.de>
parents:
82
diff
changeset
|
36 int sign = ((valBits >> 63)==0 ? 1 : -1); |
48d4ee626868
rm databinding.observable seems to be duplicate, databinding.beans now building
Frank Benoit <benoit@tionex.de>
parents:
82
diff
changeset
|
37 int exponent = cast(int) ((valBits >> 52) & 0x7ffL); |
48d4ee626868
rm databinding.observable seems to be duplicate, databinding.beans now building
Frank Benoit <benoit@tionex.de>
parents:
82
diff
changeset
|
38 long significand = (exponent==0 ? (valBits & ((1L<<52) - 1)) << 1 |
48d4ee626868
rm databinding.observable seems to be duplicate, databinding.beans now building
Frank Benoit <benoit@tionex.de>
parents:
82
diff
changeset
|
39 : (valBits & ((1L<<52) - 1)) | (1L<<52)); |
48d4ee626868
rm databinding.observable seems to be duplicate, databinding.beans now building
Frank Benoit <benoit@tionex.de>
parents:
82
diff
changeset
|
40 exponent -= 1075; |
48d4ee626868
rm databinding.observable seems to be duplicate, databinding.beans now building
Frank Benoit <benoit@tionex.de>
parents:
82
diff
changeset
|
41 // At this point, val == sign * significand * 2**exponent. |
48d4ee626868
rm databinding.observable seems to be duplicate, databinding.beans now building
Frank Benoit <benoit@tionex.de>
parents:
82
diff
changeset
|
42 |
48d4ee626868
rm databinding.observable seems to be duplicate, databinding.beans now building
Frank Benoit <benoit@tionex.de>
parents:
82
diff
changeset
|
43 /* |
48d4ee626868
rm databinding.observable seems to be duplicate, databinding.beans now building
Frank Benoit <benoit@tionex.de>
parents:
82
diff
changeset
|
44 * Special case zero to supress nonterminating normalization |
48d4ee626868
rm databinding.observable seems to be duplicate, databinding.beans now building
Frank Benoit <benoit@tionex.de>
parents:
82
diff
changeset
|
45 * and bogus scale calculation. |
48d4ee626868
rm databinding.observable seems to be duplicate, databinding.beans now building
Frank Benoit <benoit@tionex.de>
parents:
82
diff
changeset
|
46 */ |
48d4ee626868
rm databinding.observable seems to be duplicate, databinding.beans now building
Frank Benoit <benoit@tionex.de>
parents:
82
diff
changeset
|
47 if (significand == 0) { |
48d4ee626868
rm databinding.observable seems to be duplicate, databinding.beans now building
Frank Benoit <benoit@tionex.de>
parents:
82
diff
changeset
|
48 intVal = BigInteger.ZERO; |
48d4ee626868
rm databinding.observable seems to be duplicate, databinding.beans now building
Frank Benoit <benoit@tionex.de>
parents:
82
diff
changeset
|
49 intCompact = 0; |
48d4ee626868
rm databinding.observable seems to be duplicate, databinding.beans now building
Frank Benoit <benoit@tionex.de>
parents:
82
diff
changeset
|
50 precision = 1; |
48d4ee626868
rm databinding.observable seems to be duplicate, databinding.beans now building
Frank Benoit <benoit@tionex.de>
parents:
82
diff
changeset
|
51 return; |
48d4ee626868
rm databinding.observable seems to be duplicate, databinding.beans now building
Frank Benoit <benoit@tionex.de>
parents:
82
diff
changeset
|
52 } |
48d4ee626868
rm databinding.observable seems to be duplicate, databinding.beans now building
Frank Benoit <benoit@tionex.de>
parents:
82
diff
changeset
|
53 |
48d4ee626868
rm databinding.observable seems to be duplicate, databinding.beans now building
Frank Benoit <benoit@tionex.de>
parents:
82
diff
changeset
|
54 // Normalize |
48d4ee626868
rm databinding.observable seems to be duplicate, databinding.beans now building
Frank Benoit <benoit@tionex.de>
parents:
82
diff
changeset
|
55 while((significand & 1) == 0) { // i.e., significand is even |
48d4ee626868
rm databinding.observable seems to be duplicate, databinding.beans now building
Frank Benoit <benoit@tionex.de>
parents:
82
diff
changeset
|
56 significand >>= 1; |
48d4ee626868
rm databinding.observable seems to be duplicate, databinding.beans now building
Frank Benoit <benoit@tionex.de>
parents:
82
diff
changeset
|
57 exponent++; |
48d4ee626868
rm databinding.observable seems to be duplicate, databinding.beans now building
Frank Benoit <benoit@tionex.de>
parents:
82
diff
changeset
|
58 } |
48d4ee626868
rm databinding.observable seems to be duplicate, databinding.beans now building
Frank Benoit <benoit@tionex.de>
parents:
82
diff
changeset
|
59 |
48d4ee626868
rm databinding.observable seems to be duplicate, databinding.beans now building
Frank Benoit <benoit@tionex.de>
parents:
82
diff
changeset
|
60 // Calculate intVal and scale |
48d4ee626868
rm databinding.observable seems to be duplicate, databinding.beans now building
Frank Benoit <benoit@tionex.de>
parents:
82
diff
changeset
|
61 intVal = BigInteger.valueOf(sign*significand); |
48d4ee626868
rm databinding.observable seems to be duplicate, databinding.beans now building
Frank Benoit <benoit@tionex.de>
parents:
82
diff
changeset
|
62 if (exponent < 0) { |
48d4ee626868
rm databinding.observable seems to be duplicate, databinding.beans now building
Frank Benoit <benoit@tionex.de>
parents:
82
diff
changeset
|
63 intVal = intVal.multiply(BigInteger.valueOf(5).pow(-exponent)); |
48d4ee626868
rm databinding.observable seems to be duplicate, databinding.beans now building
Frank Benoit <benoit@tionex.de>
parents:
82
diff
changeset
|
64 scale_ = -exponent; |
48d4ee626868
rm databinding.observable seems to be duplicate, databinding.beans now building
Frank Benoit <benoit@tionex.de>
parents:
82
diff
changeset
|
65 } else if (exponent > 0) { |
48d4ee626868
rm databinding.observable seems to be duplicate, databinding.beans now building
Frank Benoit <benoit@tionex.de>
parents:
82
diff
changeset
|
66 intVal = intVal.multiply(BigInteger.valueOf(2).pow(exponent)); |
48d4ee626868
rm databinding.observable seems to be duplicate, databinding.beans now building
Frank Benoit <benoit@tionex.de>
parents:
82
diff
changeset
|
67 } |
48d4ee626868
rm databinding.observable seems to be duplicate, databinding.beans now building
Frank Benoit <benoit@tionex.de>
parents:
82
diff
changeset
|
68 if (intVal.bitLength() <= MAX_BIGINT_BITS) { |
48d4ee626868
rm databinding.observable seems to be duplicate, databinding.beans now building
Frank Benoit <benoit@tionex.de>
parents:
82
diff
changeset
|
69 intCompact = intVal.longValue(); |
48d4ee626868
rm databinding.observable seems to be duplicate, databinding.beans now building
Frank Benoit <benoit@tionex.de>
parents:
82
diff
changeset
|
70 } |
82 | 71 } |
72 this(String val){ | |
73 implMissing(__FILE__, __LINE__); | |
74 } | |
75 BigDecimal abs(){ | |
76 implMissing(__FILE__, __LINE__); | |
77 return null; | |
78 } | |
79 BigDecimal add(BigDecimal val){ | |
80 implMissing(__FILE__, __LINE__); | |
81 return null; | |
82 } | |
83 int compareTo(BigDecimal val){ | |
84 implMissing(__FILE__, __LINE__); | |
85 return 0; | |
86 } | |
87 int compareTo(Object o){ | |
88 implMissing(__FILE__, __LINE__); | |
89 return 0; | |
90 } | |
91 BigDecimal divide(BigDecimal val, int roundingMode){ | |
92 implMissing(__FILE__, __LINE__); | |
93 return null; | |
94 } | |
98
48d4ee626868
rm databinding.observable seems to be duplicate, databinding.beans now building
Frank Benoit <benoit@tionex.de>
parents:
82
diff
changeset
|
95 BigDecimal divide(BigDecimal val, int scale_, int roundingMode){ |
82 | 96 implMissing(__FILE__, __LINE__); |
97 return null; | |
98 } | |
99 double doubleValue(){ | |
100 implMissing(__FILE__, __LINE__); | |
101 return 0; | |
102 } | |
103 bool equals(Object x){ | |
104 implMissing(__FILE__, __LINE__); | |
105 return 0; | |
106 } | |
107 float floatValue(){ | |
108 implMissing(__FILE__, __LINE__); | |
109 return 0; | |
110 } | |
111 int hashCode(){ | |
112 implMissing(__FILE__, __LINE__); | |
113 return 0; | |
114 } | |
115 int intValue(){ | |
116 implMissing(__FILE__, __LINE__); | |
117 return 0; | |
118 } | |
119 long longValue(){ | |
120 implMissing(__FILE__, __LINE__); | |
121 return 0; | |
122 } | |
123 BigDecimal max(BigDecimal val){ | |
124 implMissing(__FILE__, __LINE__); | |
125 return null; | |
126 } | |
127 BigDecimal min(BigDecimal val){ | |
128 implMissing(__FILE__, __LINE__); | |
129 return null; | |
130 } | |
131 BigDecimal movePointLeft(int n){ | |
132 implMissing(__FILE__, __LINE__); | |
133 return null; | |
134 } | |
135 BigDecimal movePointRight(int n){ | |
136 implMissing(__FILE__, __LINE__); | |
137 return null; | |
138 } | |
139 BigDecimal multiply(BigDecimal val){ | |
140 implMissing(__FILE__, __LINE__); | |
141 return null; | |
142 } | |
143 BigDecimal negate(){ | |
144 implMissing(__FILE__, __LINE__); | |
145 return null; | |
146 } | |
147 int scale(){ | |
148 implMissing(__FILE__, __LINE__); | |
98
48d4ee626868
rm databinding.observable seems to be duplicate, databinding.beans now building
Frank Benoit <benoit@tionex.de>
parents:
82
diff
changeset
|
149 return this.scale_; |
82 | 150 } |
98
48d4ee626868
rm databinding.observable seems to be duplicate, databinding.beans now building
Frank Benoit <benoit@tionex.de>
parents:
82
diff
changeset
|
151 BigDecimal setScale(int scale_){ |
82 | 152 implMissing(__FILE__, __LINE__); |
153 return null; | |
154 } | |
98
48d4ee626868
rm databinding.observable seems to be duplicate, databinding.beans now building
Frank Benoit <benoit@tionex.de>
parents:
82
diff
changeset
|
155 BigDecimal setScale(int scale_, int roundingMode){ |
82 | 156 implMissing(__FILE__, __LINE__); |
157 return null; | |
158 } | |
159 int signum(){ | |
160 implMissing(__FILE__, __LINE__); | |
161 return 0; | |
162 } | |
163 BigDecimal subtract(BigDecimal val){ | |
164 implMissing(__FILE__, __LINE__); | |
165 return null; | |
166 } | |
167 BigInteger toBigInteger(){ | |
168 implMissing(__FILE__, __LINE__); | |
169 return null; | |
170 } | |
171 String toString(){ | |
172 implMissing(__FILE__, __LINE__); | |
173 return null; | |
174 } | |
175 BigInteger unscaledValue(){ | |
176 implMissing(__FILE__, __LINE__); | |
177 return null; | |
178 } | |
179 static BigDecimal valueOf(long val){ | |
180 implMissing(__FILE__, __LINE__); | |
181 return null; | |
182 } | |
98
48d4ee626868
rm databinding.observable seems to be duplicate, databinding.beans now building
Frank Benoit <benoit@tionex.de>
parents:
82
diff
changeset
|
183 static BigDecimal valueOf(long unscaledVal, int scale_){ |
82 | 184 implMissing(__FILE__, __LINE__); |
185 return null; | |
186 } | |
187 } | |
188 |