v2 / vlib / builtin / float_test.v
313 lines · 297 sloc · 9.26 KB · 388caee862d59ec9a34395423127ad9e9e5122aa
Raw
1import math
2
3fn test_float_decl() {
4 // TODO: ARM64 backend doesn't support typeof()
5 // z := 1f
6 // assert z > 0
7 x1 := 1e10
8 x2 := -2e16
9 x3 := 1e-15
10 x4 := -9e-4
11 // assert typeof(x1).name == 'f64'
12 // assert typeof(x2).name == 'f64'
13 // assert typeof(x3).name == 'f64'
14 // assert typeof(x4).name == 'f64'
15 x5 := 4e108
16 x6 := -7e99
17 x7 := 3e-205
18 x8 := -6e-147
19 // assert typeof(x5).name == 'f64'
20 // assert typeof(x6).name == 'f64'
21 // assert typeof(x7).name == 'f64'
22 // assert typeof(x8).name == 'f64'
23 x9 := 312874834.77
24 x10 := -22399994.06
25 x11 := 0.0000000019
26 x12 := -0.00000000008
27 // assert typeof(x9).name == 'f64'
28 // assert typeof(x10).name == 'f64'
29 // assert typeof(x11).name == 'f64'
30 // assert typeof(x12).name == 'f64'
31 x13 := 34234234809890890898903213154353453453253253243432413232228908902183918392183902432432438980380123021983901392183921389083913890389089031.0
32 x14 := -39999999999999999999222212128182813294989082302832183928343325325233253242312331324392839238239829389038097438248932789371837218372837293.8
33 x15 := 0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002
34 x16 := -0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004
35 // assert typeof(x13).name == 'f64'
36 // assert typeof(x14).name == 'f64'
37 // assert typeof(x15).name == 'f64'
38 // assert typeof(x16).name == 'f64'
39 _ = x1
40 _ = x2
41 _ = x3
42 _ = x4
43 _ = x5
44 _ = x6
45 _ = x7
46 _ = x8
47 _ = x9
48 _ = x10
49 _ = x11
50 _ = x12
51 _ = x13
52 _ = x14
53 _ = x15
54 _ = x16
55}
56
57fn test_f32_equal_operator() {
58 b := f32(1.0)
59 mut a := f32(1.0)
60 a += 0.0000019073486328125
61 assert a != b
62 a -= 0.0000019073486328125
63 assert a == b
64 assert -1 == 1 * -1
65 assert -1.0 == 1.0 * -1.0
66 a = 1
67 a += 0.0000019073486328125
68 a -= 0.0000019073486328125
69 assert a == f32(1.0)
70 a += 0.000001
71 assert !(a < f32(1))
72 assert !(a <= f32(1))
73 assert a > f32(1)
74 assert a >= 1
75 assert a != 1
76 f := 1.2
77 ab := int(f)
78 assert ab == 1
79 e := f32(-1.602176634e-19)
80 m := f32(9.1093837015e-31)
81 assert e < m
82 assert e <= m
83 assert e != m
84 assert !(e == m)
85 assert m >= e
86 assert m > e
87}
88
89fn test_f64_equal_operator() {
90 b := 1.0
91 mut a := 1.0
92 a += 0.0000019073486328125
93 assert a != b
94 a -= 0.0000019073486328125
95 assert a == b
96 e := -1.602176634e-19
97 m := 9.1093837015e-31
98 assert e < m
99 assert e <= m
100 assert e != m
101 assert !(e == m)
102 assert m >= e
103 assert m > e
104}
105
106fn test_f64_eq_epsilon() {
107 a := 1.662248544459347e308
108 b := 1.662248544459348e308
109 x := 1.662248544459352e308
110 assert a != b
111 assert a.eq_epsilon(b)
112 assert b.eq_epsilon(a)
113 assert (-a).eq_epsilon(-b)
114 assert (-b).eq_epsilon(-a)
115 assert !a.eq_epsilon(x)
116 assert !x.eq_epsilon(a)
117 assert !a.eq_epsilon(-b)
118 assert !(-a).eq_epsilon(b)
119 c := 1.5367748374385438503
120 d := -1.5367748374385447257
121 z := 1.5367748378943546
122 assert c != -d
123 assert c.eq_epsilon(-d)
124 assert d.eq_epsilon(-c)
125 assert !c.eq_epsilon(z)
126 assert !z.eq_epsilon(c)
127 e := 2.531434251587394233e-308
128 f := 2.531434251587395675e-308
129 y := 2.531434251587398934e-308
130 assert e != f
131 assert e.eq_epsilon(f)
132 assert (-f).eq_epsilon(-e)
133 assert !e.eq_epsilon(y)
134 assert !(-y).eq_epsilon(-e)
135}
136
137fn test_f32_eq_epsilon() {
138 a := f32(3.244331e38)
139 b := f32(3.244332e38)
140 x := f32(3.244338e38)
141 assert a != b
142 assert a.eq_epsilon(b)
143 assert b.eq_epsilon(a)
144 assert (-a).eq_epsilon(-b)
145 assert (-b).eq_epsilon(-a)
146 assert !a.eq_epsilon(x)
147 assert !(-x).eq_epsilon(-a)
148 assert !a.eq_epsilon(-b)
149 assert !(-a).eq_epsilon(b)
150 c := f32(0.9546742)
151 d := f32(-0.9546745)
152 z := f32(0.9546754)
153 assert c != -d
154 assert c.eq_epsilon(-d)
155 assert d.eq_epsilon(-c)
156 assert !c.eq_epsilon(z)
157 assert !z.eq_epsilon(c)
158 e := f32(-1.5004390e-38)
159 f := f32(-1.5004395e-38)
160 y := f32(-1.5004409e-38)
161 assert e != f
162 assert e.eq_epsilon(f)
163 assert (-f).eq_epsilon(-e)
164 assert !e.eq_epsilon(y)
165 assert !(-y).eq_epsilon(-e)
166}
167
168fn test_float_point_formatting_rounding() {
169 float_1 := 462.18
170 float_2 := 45.02227
171 float_3 := 238.5
172 float_4 := 239.5
173
174 assert '${float_1:0.0f}' == '462'
175 assert '${float_2:0.0f}' == '45'
176 assert '${float_3:0.0f}' == '239'
177 assert '${float_4:0.0f}' == '240'
178
179 assert '${239.5555551:0.0f}' == '240'
180 assert '${239.5555551:0.1f}' == '239.6'
181 assert '${239.5555551:0.2f}' == '239.56'
182 assert '${239.5555551:0.3f}' == '239.556'
183 assert '${239.5555551:0.4f}' == '239.5556'
184 assert '${239.5555551:0.5f}' == '239.55556'
185 assert '${239.5555551:0.6f}' == '239.555555'
186 assert '${239.5555551:0.7f}' == '239.5555551'
187 assert '${239.5555551:0.8f}' == '239.55555510'
188 assert '${239.5555551:0.9f}' == '239.555555100'
189 assert '${239.5555551:0.10f}' == '239.5555551000'
190 assert '${239.5555551:0.11f}' == '239.55555510000'
191
192 assert '${239.5:0.0f}' == '240'
193 assert '${239.55:0.1f}' == '239.6'
194 assert '${239.555:0.2f}' == '239.56'
195 assert '${239.5555:0.3f}' == '239.555' // Note: 5 ?
196 assert '${239.55555:0.4f}' == '239.5556'
197 assert '${239.555555:0.5f}' == '239.55555' // Note: 5 ?
198 assert '${239.5555555:0.6f}' == '239.555556' // after this, it is all ending in 6
199 assert '${239.55555555:0.7f}' == '239.5555556'
200 assert '${239.555555555:0.8f}' == '239.55555556'
201 assert '${239.5555555555:0.9f}' == '239.555555556'
202 assert '${239.55555555555:0.10f}' == '239.5555555556'
203
204 assert '${239.5550:0.3f}' == '239.555'
205 assert '${239.5551:0.3f}' == '239.555'
206 assert '${239.5552:0.3f}' == '239.555'
207 assert '${239.5553:0.3f}' == '239.555'
208 assert '${239.5554:0.3f}' == '239.555'
209 assert '${239.5555:0.3f}' == '239.555'
210 assert '${239.5556:0.3f}' == '239.556' // rounding at last 6 ?
211 assert '${239.5557:0.3f}' == '239.556'
212 assert '${239.5558:0.3f}' == '239.556'
213 assert '${239.5559:0.3f}' == '239.556'
214
215 assert '${239.5555551:0.6f}' == '239.555555'
216 assert '${239.5555552:0.6f}' == '239.555555'
217 assert '${239.5555553:0.6f}' == '239.555555'
218 assert '${239.5555554:0.6f}' == '239.555555'
219 assert '${239.5555555:0.6f}' == '239.555556'
220 assert '${239.5555556:0.6f}' == '239.555556'
221 assert '${239.5555557:0.6f}' == '239.555556'
222 assert '${239.5555558:0.6f}' == '239.555556'
223 assert '${239.5555559:0.6f}' == '239.555556'
224
225 assert '${239.55555555555:0.10f}' == '239.5555555556'
226 assert '${239.55555555555:0.9f}' == '239.555555556'
227 assert '${239.55555555555:0.8f}' == '239.55555556'
228 assert '${239.55555555555:0.7f}' == '239.5555556'
229 assert '${239.55555555555:0.6f}' == '239.555556'
230 assert '${239.55555555555:0.5f}' == '239.55556'
231 assert '${239.55555555555:0.4f}' == '239.5556'
232 assert '${239.55555555555:0.3f}' == '239.556'
233 assert '${239.55555555555:0.2f}' == '239.56'
234 assert '${239.55555555555:0.1f}' == '239.6'
235 assert '${239.55555555555:0.0f}' == '240'
236
237 assert '${-239.55555555555:0.10f}' == '-239.5555555556'
238 assert '${-239.55555555555:0.9f}' == '-239.555555556'
239 assert '${-239.55555555555:0.8f}' == '-239.55555556'
240 assert '${-239.55555555555:0.7f}' == '-239.5555556'
241 assert '${-239.55555555555:0.6f}' == '-239.555556'
242 assert '${-239.55555555555:0.5f}' == '-239.55556'
243 assert '${-239.55555555555:0.4f}' == '-239.5556'
244 assert '${-239.55555555555:0.3f}' == '-239.556'
245 assert '${-239.55555555555:0.2f}' == '-239.56'
246 assert '${-239.55555555555:0.1f}' == '-239.6'
247 assert '${-239.55555555555:0.0f}' == '-240'
248}
249
250fn test_float_zero_str() {
251 f1 := f32(0.0)
252 f2 := 0.0
253 assert f1.str() == '0.0'
254 assert '${f1}' == '0.0'
255 assert f2.str() == '0.0'
256 assert '${f2}' == '0.0'
257}
258
259fn test_f32_zero_chars() {
260 bits := math.f32_bits('-0.0'.f32())
261 assert math.f32_bits('-0 ms'.f32()) == bits
262 assert math.f32_bits('-0.0 ms'.f32()) == bits
263 assert math.f32_bits('-0.000 ms'.f32()) == bits
264 assert math.f32_bits('0 ms'.f32()) == 0
265 assert math.f32_bits('0.0 ms'.f32()) == 0
266 assert math.f32_bits('0.000 ms'.f32()) == 0
267 assert math.f32_bits('-0'.f32()) == bits
268 assert math.f32_bits('-0.0'.f32()) == bits
269 assert math.f32_bits('-0.000'.f32()) == bits
270 assert math.f32_bits('0'.f32()) == 0
271 assert math.f32_bits('0.0'.f32()) == 0
272 assert math.f32_bits('0.000'.f32()) == 0
273 assert '-0 ms'.f32().str() == '-0.0'
274 assert '-0.0 ms'.f32().str() == '-0.0'
275 assert '-0.000 ms'.f32().str() == '-0.0'
276 assert '0 ms'.f32().str() == '0.0'
277 assert '0.0 ms'.f32().str() == '0.0'
278 assert '0.000 ms'.f32().str() == '0.0'
279 assert '-0'.f32().str() == '-0.0'
280 assert '-0.0'.f32().str() == '-0.0'
281 assert '-0.000'.f32().str() == '-0.0'
282 assert '0'.f32().str() == '0.0'
283 assert '0.0'.f32().str() == '0.0'
284 assert '0.00'.f32().str() == '0.0'
285}
286
287fn test_f64_zero_chars() {
288 bits := math.f64_bits('-0.0'.f64())
289 assert math.f64_bits('-0 ms'.f64()) == bits
290 assert math.f64_bits('-0.0 ms'.f64()) == bits
291 assert math.f64_bits('-0.000 ms'.f64()) == bits
292 assert math.f64_bits('0 ms'.f64()) == 0
293 assert math.f64_bits('0.0 ms'.f64()) == 0
294 assert math.f64_bits('0.000 ms'.f64()) == 0
295 assert math.f64_bits('-0'.f64()) == bits
296 assert math.f64_bits('-0.0'.f64()) == bits
297 assert math.f64_bits('-0.000'.f64()) == bits
298 assert math.f64_bits('0'.f64()) == 0
299 assert math.f64_bits('0.0'.f64()) == 0
300 assert math.f64_bits('0.000'.f64()) == 0
301 assert '-0 ms'.f64().str() == '-0.0'
302 assert '-0.0 ms'.f64().str() == '-0.0'
303 assert '-0.000 ms'.f64().str() == '-0.0'
304 assert '0 ms'.f64().str() == '0.0'
305 assert '0.0 ms'.f64().str() == '0.0'
306 assert '0.000 ms'.f64().str() == '0.0'
307 assert '-0'.f64().str() == '-0.0'
308 assert '-0.0'.f64().str() == '-0.0'
309 assert '-0.000'.f64().str() == '-0.0'
310 assert '0'.f64().str() == '0.0'
311 assert '0.0'.f64().str() == '0.0'
312 assert '0.00'.f64().str() == '0.0'
313}
314