v
Зеркало из https://github.com/vlang/v
1import math
2import math.stats
3
4fn test_freq() {
5// Tests were also verified on Wolfram Alpha
6data := [f64(10.0), f64(10.0), f64(5.9), f64(2.7)]
7mut o := stats.freq(data, 10.0)
8assert o == 2
9o = stats.freq(data, 2.7)
10assert o == 1
11o = stats.freq(data, 15)
12assert o == 0
13}
14
15fn tst_res(str1 string, str2 string) bool {
16if (math.abs(str1.f64() - str2.f64())) < 1e-5 {
17return true
18}
19return false
20}
21
22fn test_mean() {
23// Tests were also verified on Wolfram Alpha
24mut data := [f64(10.0), f64(4.45), f64(5.9), f64(2.7)]
25mut o := stats.mean(data)
26// Some issue with precision comparison in f64 using == operator hence serializing to string
27assert tst_res(o.str(), '5.762500')
28data = [f64(-3.0), f64(67.31), f64(4.4), f64(1.89)]
29o = stats.mean(data)
30// Some issue with precision comparison in f64 using == operator hence serializing to string
31assert tst_res(o.str(), '17.650000')
32data = [f64(12.0), f64(7.88), f64(76.122), f64(54.83)]
33o = stats.mean(data)
34// Some issue with precision comparison in f64 using == operator hence serializing to string
35assert tst_res(o.str(), '37.708000')
36}
37
38fn test_geometric_mean() {
39// Tests were also verified on Wolfram Alpha
40mut data := [f64(10.0), f64(4.45), f64(5.9), f64(2.7)]
41mut o := stats.geometric_mean(data)
42// Some issue with precision comparison in f64 using == operator hence serializing to string
43assert tst_res(o.str(), '5.15993')
44data = [f64(-3.0), f64(67.31), f64(4.4), f64(1.89)]
45o = stats.geometric_mean(data)
46// Some issue with precision comparison in f64 using == operator hence serializing to string
47ok := o.str() == 'nan' || o.str() == '-nan' || o.str() == '-1.#IND00' || o == f64(0)
48|| o.str() == '-nan(ind)'
49assert ok // Because in math it yields a complex number
50data = [f64(12.0), f64(7.88), f64(76.122), f64(54.83)]
51o = stats.geometric_mean(data)
52// Some issue with precision comparison in f64 using == operator hence serializing to string
53assert tst_res(o.str(), '25.064496')
54}
55
56fn test_harmonic_mean() {
57// Tests were also verified on Wolfram Alpha
58mut data := [f64(10.0), f64(4.45), f64(5.9), f64(2.7)]
59mut o := stats.harmonic_mean(data)
60// Some issue with precision comparison in f64 using == operator hence serializing to string
61assert tst_res(o.str(), '4.626519')
62data = [f64(-3.0), f64(67.31), f64(4.4), f64(1.89)]
63o = stats.harmonic_mean(data)
64// Some issue with precision comparison in f64 using == operator hence serializing to string
65assert tst_res(o.str(), '9.134577')
66data = [f64(12.0), f64(7.88), f64(76.122), f64(54.83)]
67o = stats.harmonic_mean(data)
68// Some issue with precision comparison in f64 using == operator hence serializing to string
69assert tst_res(o.str(), '16.555477')
70}
71
72fn test_median() {
73// Tests were also verified on Wolfram Alpha
74// Assumes sorted array
75
76// Even
77mut data := [f64(2.7), f64(4.45), f64(5.9), f64(10.0)]
78mut o := stats.median(data)
79// Some issue with precision comparison in f64 using == operator hence serializing to string
80assert tst_res(o.str(), '5.175000')
81data = [f64(-3.0), f64(1.89), f64(4.4), f64(67.31)]
82o = stats.median(data)
83// Some issue with precision comparison in f64 using == operator hence serializing to string
84assert tst_res(o.str(), '3.145000')
85data = [f64(7.88), f64(12.0), f64(54.83), f64(76.122)]
86o = stats.median(data)
87// Some issue with precision comparison in f64 using == operator hence serializing to string
88assert tst_res(o.str(), '33.415000')
89
90// Odd
91data = [f64(2.7), f64(4.45), f64(5.9), f64(10.0), f64(22)]
92o = stats.median(data)
93assert o == f64(5.9)
94data = [f64(-3.0), f64(1.89), f64(4.4), f64(9), f64(67.31)]
95o = stats.median(data)
96assert o == f64(4.4)
97data = [f64(7.88), f64(3.3), f64(12.0), f64(54.83), f64(76.122)]
98o = stats.median(data)
99assert o == f64(12.0)
100}
101
102fn test_mode() {
103// Tests were also verified on Wolfram Alpha
104mut data := [f64(2.7), f64(2.7), f64(4.45), f64(5.9), f64(10.0)]
105mut o := stats.mode(data)
106assert o == f64(2.7)
107data = [f64(-3.0), f64(1.89), f64(1.89), f64(1.89), f64(9), f64(4.4), f64(4.4), f64(9),
108f64(67.31)]
109o = stats.mode(data)
110assert o == f64(1.89)
111// Testing greedy nature
112data = [f64(2.0), f64(4.0), f64(2.0), f64(4.0)]
113o = stats.mode(data)
114assert o == f64(2.0)
115}
116
117fn test_rms() {
118// Tests were also verified on Wolfram Alpha
119mut data := [f64(10.0), f64(4.45), f64(5.9), f64(2.7)]
120mut o := stats.rms(data)
121// Some issue with precision comparison in f64 using == operator hence serializing to string
122assert tst_res(o.str(), '6.362046')
123data = [f64(-3.0), f64(67.31), f64(4.4), f64(1.89)]
124o = stats.rms(data)
125// Some issue with precision comparison in f64 using == operator hence serializing to string
126assert tst_res(o.str(), '33.773393')
127data = [f64(12.0), f64(7.88), f64(76.122), f64(54.83)]
128o = stats.rms(data)
129// Some issue with precision comparison in f64 using == operator hence serializing to string
130assert tst_res(o.str(), '47.452561')
131}
132
133fn test_population_variance() {
134// Tests were also verified on Wolfram Alpha
135mut data := [f64(10.0), f64(4.45), f64(5.9), f64(2.7)]
136mut o := stats.population_variance(data)
137// Some issue with precision comparison in f64 using == operator hence serializing to string
138assert tst_res(o.str(), '7.269219')
139data = [f64(-3.0), f64(67.31), f64(4.4), f64(1.89)]
140o = stats.population_variance(data)
141// Some issue with precision comparison in f64 using == operator hence serializing to string
142assert tst_res(o.str(), '829.119550')
143data = [f64(12.0), f64(7.88), f64(76.122), f64(54.83)]
144o = stats.population_variance(data)
145// Some issue with precision comparison in f64 using == operator hence serializing to string
146assert tst_res(o.str(), '829.852282')
147}
148
149fn test_sample_variance() {
150// Tests were also verified on Wolfram Alpha
151mut data := [f64(10.0), f64(4.45), f64(5.9), f64(2.7)]
152mut o := stats.sample_variance(data)
153// Some issue with precision comparison in f64 using == operator hence serializing to string
154assert tst_res(o.str(), '9.692292')
155data = [f64(-3.0), f64(67.31), f64(4.4), f64(1.89)]
156o = stats.sample_variance(data)
157// Some issue with precision comparison in f64 using == operator hence serializing to string
158assert tst_res(o.str(), '1105.492733')
159data = [f64(12.0), f64(7.88), f64(76.122), f64(54.83)]
160o = stats.sample_variance(data)
161// Some issue with precision comparison in f64 using == operator hence serializing to string
162assert tst_res(o.str(), '1106.469709')
163}
164
165fn test_population_stddev() {
166// Tests were also verified on Wolfram Alpha
167mut data := [f64(10.0), f64(4.45), f64(5.9), f64(2.7)]
168mut o := stats.population_stddev(data)
169// Some issue with precision comparison in f64 using == operator hence serializing to string
170assert tst_res(o.str(), '2.696149')
171data = [f64(-3.0), f64(67.31), f64(4.4), f64(1.89)]
172o = stats.population_stddev(data)
173// Some issue with precision comparison in f64 using == operator hence serializing to string
174assert tst_res(o.str(), '28.794436')
175data = [f64(12.0), f64(7.88), f64(76.122), f64(54.83)]
176o = stats.population_stddev(data)
177// Some issue with precision comparison in f64 using == operator hence serializing to string
178assert tst_res(o.str(), '28.807157')
179}
180
181fn test_sample_stddev() {
182// Tests were also verified on Wolfram Alpha
183mut data := [f64(10.0), f64(4.45), f64(5.9), f64(2.7)]
184mut o := stats.sample_stddev(data)
185// Some issue with precision comparison in f64 using == operator hence serializing to string
186assert tst_res(o.str(), '3.113245')
187data = [f64(-3.0), f64(67.31), f64(4.4), f64(1.89)]
188o = stats.sample_stddev(data)
189// Some issue with precision comparison in f64 using == operator hence serializing to string
190assert tst_res(o.str(), '33.248951')
191data = [f64(12.0), f64(7.88), f64(76.122), f64(54.83)]
192o = stats.sample_stddev(data)
193// Some issue with precision comparison in f64 using == operator hence serializing to string
194assert tst_res(o.str(), '33.263639')
195}
196
197fn test_absdev() {
198// Tests were also verified on Wolfram Alpha
199mut data := [f64(10.0), f64(4.45), f64(5.9), f64(2.7)]
200mut o := stats.absdev(data)
201// Some issue with precision comparison in f64 using == operator hence serializing to string
202assert tst_res(o.str(), '2.187500')
203data = [f64(-3.0), f64(67.31), f64(4.4), f64(1.89)]
204o = stats.absdev(data)
205// Some issue with precision comparison in f64 using == operator hence serializing to string
206assert tst_res(o.str(), '24.830000')
207data = [f64(12.0), f64(7.88), f64(76.122), f64(54.83)]
208o = stats.absdev(data)
209// Some issue with precision comparison in f64 using == operator hence serializing to string
210assert tst_res(o.str(), '27.768000')
211}
212
213fn test_min() {
214// Tests were also verified on Wolfram Alpha
215mut data := [f64(10.0), f64(4.45), f64(5.9), f64(2.7)]
216mut o := stats.min(data)
217assert o == f64(2.7)
218data = [f64(-3.0), f64(67.31), f64(4.4), f64(1.89)]
219o = stats.min(data)
220assert o == f64(-3.0)
221data = [f64(12.0), f64(7.88), f64(76.122), f64(54.83)]
222o = stats.min(data)
223assert o == f64(7.88)
224}
225
226fn test_max() {
227// Tests were also verified on Wolfram Alpha
228mut data := [f64(10.0), f64(4.45), f64(5.9), f64(2.7)]
229mut o := stats.max(data)
230assert o == f64(10.0)
231data = [f64(-3.0), f64(67.31), f64(4.4), f64(1.89)]
232o = stats.max(data)
233assert o == f64(67.31)
234data = [f64(12.0), f64(7.88), f64(76.122), f64(54.83)]
235o = stats.max(data)
236assert o == f64(76.122)
237}
238
239fn test_range() {
240// Tests were also verified on Wolfram Alpha
241mut data := [f64(10.0), f64(4.45), f64(5.9), f64(2.7)]
242mut o := stats.range(data)
243assert o == f64(7.3)
244data = [f64(-3.0), f64(67.31), f64(4.4), f64(1.89)]
245o = stats.range(data)
246assert o == f64(70.31)
247data = [f64(12.0), f64(7.88), f64(76.122), f64(54.83)]
248o = stats.range(data)
249assert o == f64(68.242)
250}
251
252fn test_passing_empty() {
253data := []f64{}
254assert stats.freq(data, 0) == 0
255assert stats.mean(data) == f64(0)
256assert stats.geometric_mean(data) == f64(0)
257assert stats.harmonic_mean(data) == f64(0)
258assert stats.median(data) == f64(0)
259assert stats.mode(data) == f64(0)
260assert stats.rms(data) == f64(0)
261assert stats.population_variance(data) == f64(0)
262assert stats.sample_variance(data) == f64(0)
263assert stats.population_stddev(data) == f64(0)
264assert stats.sample_stddev(data) == f64(0)
265assert stats.absdev(data) == f64(0)
266assert stats.min(data) == f64(0)
267assert stats.max(data) == f64(0)
268assert stats.range(data) == f64(0)
269}
270