implemented AddedDoubleBinaryPrecise
@@ -167,7 +167,7 @@ | ||
167 | 167 | // m += val * probDist[val]; |
168 | 168 | //} |
169 | 169 | //mean = m; |
170 | - AddedDouble m = new AddedDouble(); | |
170 | + AddedDouble m = new AddedDoubleBinaryPrecise(); | |
171 | 171 | foreach (double val in probDist.Keys) |
172 | 172 | { |
173 | 173 | m.Add(val * probDist[val]); |
@@ -181,7 +181,7 @@ | ||
181 | 181 | // m2 += val * val * probDist[val]; |
182 | 182 | //} |
183 | 183 | //variance = m2 - mean * mean; |
184 | - AddedDouble m2 = new AddedDouble(); | |
184 | + AddedDouble m2 = new AddedDoubleBinaryPrecise(); | |
185 | 185 | foreach (double val in probDist.Keys) |
186 | 186 | { |
187 | 187 | m2.Add((val - mean) * (val - mean) * probDist[val]); |
@@ -198,7 +198,7 @@ | ||
198 | 198 | //} |
199 | 199 | //skewness = m3 - 3 * m * m2 + 2 * m * m * m; |
200 | 200 | //skewness /= (sd * sd * sd); |
201 | - AddedDouble m3 = new AddedDouble(); | |
201 | + AddedDouble m3 = new AddedDoubleBinaryPrecise(); | |
202 | 202 | foreach (double val in probDist.Keys) |
203 | 203 | { |
204 | 204 | m3.Add((val - mean) * (val - mean) * (val - mean) * probDist[val]); |
@@ -213,7 +213,7 @@ | ||
213 | 213 | //} |
214 | 214 | //kurtosis = m4 - 4 * m * m3 + 6 * m2 * m * m - 3 * m * m * m * m; |
215 | 215 | //kurtosis = kurtosis / (sd * sd * sd * sd) - 3d; |
216 | - AddedDouble m4 = new AddedDouble(); | |
216 | + AddedDouble m4 = new AddedDoubleBinaryPrecise(); | |
217 | 217 | foreach (double val in probDist.Keys) |
218 | 218 | { |
219 | 219 | m4.Add((val - mean) * (val - mean) * (val - mean) * (val - mean) * probDist[val]); |
@@ -35,7 +35,7 @@ | ||
35 | 35 | { |
36 | 36 | s = initialValue; |
37 | 37 | } |
38 | - public void Add(double value) | |
38 | + public virtual void Add(double value) | |
39 | 39 | { |
40 | 40 | r = r + value; |
41 | 41 | t = s; |
@@ -43,10 +43,85 @@ | ||
43 | 43 | t = s - t; |
44 | 44 | r = r - t; |
45 | 45 | } |
46 | - public double Value | |
46 | + public virtual double Value | |
47 | 47 | { |
48 | 48 | get { return s; } |
49 | 49 | } |
50 | 50 | |
51 | 51 | } |
52 | + public class AddedDoubleBinary : AddedDouble | |
53 | + { | |
54 | + List<double> list; | |
55 | + public AddedDoubleBinary() | |
56 | + { | |
57 | + list = new List<double>(); | |
58 | + } | |
59 | + public AddedDoubleBinary(double initialValue) | |
60 | + : this() | |
61 | + { | |
62 | + list.Add(initialValue); | |
63 | + } | |
64 | + public override void Add(double value) | |
65 | + { | |
66 | + list.Add(value); | |
67 | + } | |
68 | + public override double Value | |
69 | + { | |
70 | + get { | |
71 | + if (list.Count == 0) return 0d; | |
72 | + while (list.Count > 1) | |
73 | + { | |
74 | + int end = list.Count; | |
75 | + int half = list.Count / 2; | |
76 | + for (int i = 0; i < half; i++) | |
77 | + { | |
78 | + int j = end - 1 - i; | |
79 | + list[i] += list[j]; | |
80 | + list.RemoveAt(j); | |
81 | + } | |
82 | + } | |
83 | + return list[0]; | |
84 | + } | |
85 | + } | |
86 | + | |
87 | + } | |
88 | + | |
89 | + public class AddedDoubleBinaryPrecise : AddedDouble | |
90 | + { | |
91 | + List<AddedDouble> list; | |
92 | + public AddedDoubleBinaryPrecise() | |
93 | + { | |
94 | + list = new List<AddedDouble>(); | |
95 | + } | |
96 | + public AddedDoubleBinaryPrecise(double initialValue) | |
97 | + : this() | |
98 | + { | |
99 | + list.Add(new AddedDouble(initialValue)); | |
100 | + } | |
101 | + public override void Add(double value) | |
102 | + { | |
103 | + list.Add(new AddedDouble(value)); | |
104 | + } | |
105 | + public override double Value | |
106 | + { | |
107 | + get | |
108 | + { | |
109 | + if (list.Count == 0) return 0d; | |
110 | + while (list.Count > 1) | |
111 | + { | |
112 | + int end = list.Count; | |
113 | + int half = list.Count / 2; | |
114 | + for (int i = 0; i < half; i++) | |
115 | + { | |
116 | + int j = end - 1 - i; | |
117 | + list[i].Add(list[j].Value); | |
118 | + list.RemoveAt(j); | |
119 | + } | |
120 | + } | |
121 | + return list[0].Value; | |
122 | + } | |
123 | + } | |
124 | + | |
125 | + } | |
126 | + | |
52 | 127 | } |