v / vlib / strconv / f32_str_should_be_different_test.v
35 lines · 32 sloc · 903 bytes · a8e0c9efff08d54372f83b23018dff3704543cba
Raw
1import math
2
3fn test_around() {
4 // do not pass 0
5 for f in [f32(1e-12), 1e-9, 1e-6, 1e-4, 0.1, 0.2, 0.5, 1, 2, 5, 10, 1e6, 1e7, 1e9, 1e12] {
6 check_around(f, 1000)
7 }
8}
9
10fn check_around(fval f32, total int) {
11 check(fval, total)
12 check(-fval, total)
13}
14
15fn check(fval f32, total int) {
16 middle_bits := math.f32_bits(fval)
17 start_bits := middle_bits - u32(total / 2)
18 end_bits := middle_bits + u32(total / 2)
19 min, max := if start_bits < end_bits { start_bits, end_bits } else { end_bits, start_bits }
20 println('> check_around ${total} f32 values around fval: ${fval:26.12f}, middle_bits for fval: ${middle_bits:12} | min: ${min:12} | max: ${max:12}')
21 for ux in min .. max {
22 x := math.f32_from_bits(ux)
23 if math.is_nan(x) {
24 continue
25 }
26 uy := ux - 1
27 y := math.f32_from_bits(uy)
28 if x == y {
29 continue
30 }
31 sx := x.str()
32 sy := y.str()
33 assert sx != sy, 'math.f32_from_bits(${ux})'
34 }
35}
36