v / vlib / strconv / converter_test.v
53 lines · 49 sloc · 1.7 KB · c286775d9f65dde5071d56936ffd19db4425cca9
Raw
1module main
2
3fn test_issue_16448() {
4 float_prec := 1.9999999999999999 + 0.0000000000000000005
5 assert float_prec > 1.99
6 assert float_prec < 2.01
7}
8
9fn test_atof_converter() {
10 mut float_prec := 1.9999999999999999 + 0.0000000000000000005
11 assert float_prec == 2.0
12 float_prec = 3.9999999999999999 + 0.0000000000000000005
13 assert float_prec == 4.0
14 float_prec = -3.9999999999999999 - 0.0000000000000000005
15 assert float_prec == -4.0
16 float_prec = -1.9999999999999999 - 0.0000000000000000005
17 assert float_prec == -2.0
18 float_prec = 0.025 + 0.0000000000000000005
19 assert float_prec == 0.025
20 float_prec = 0.0625 + 0.0000000000000000005
21 assert float_prec == 0.0625
22 float_prec = 0.0009765625 + 0.0000000000000000005
23 assert float_prec > 0.00097656250 && float_prec < 0.00097656251
24 float_prec = -0.025 - 0.0000000000000000005
25 assert float_prec == -0.025
26 float_prec = -0.0625 - 0.0000000000000000005
27 assert float_prec == -0.0625
28 float_prec = -0.0009765625 - 0.0000000000000000005
29 assert float_prec < -0.00097656250 && float_prec > -0.00097656251
30}
31
32// Testing all the numbers between -100E6..100E6 takes over a minute with clang on i3
33// while for just -1E5..1E5, it takes less than a second.
34// const r = i64(100_000_001)
35// const r = i64(17_000_001)
36const r = i64(100_001)
37
38fn test_renormalisation_inside_converter() {
39 for i in -r .. r {
40 s := '${i}.9999999999999999999'
41 fs := s.f64()
42 ifs := i64(fs)
43 if i % 10000 == 0 {
44 eprintln('>>> s: ${s:30s} | fs: ${fs:20.6f} | ifs: ${ifs:20}')
45 }
46 if i < 0 && ifs != i - 1 {
47 panic('invalid negative f64 value, i: ${i} | s: ${s} | fs: ${fs} | ifs: ${ifs}')
48 }
49 if i > 0 && ifs != i + 1 {
50 panic('invalid positive f64 value, i: ${i} | s: ${s} | fs: ${fs} | ifs: ${ifs}')
51 }
52 }
53}
54