| 1 | import math |
| 2 | |
| 3 | fn 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 | |
| 10 | fn check_around(fval f32, total int) { |
| 11 | check(fval, total) |
| 12 | check(-fval, total) |
| 13 | } |
| 14 | |
| 15 | fn 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 | |