1cbd624adSopenharmony_ciuse minimal_lexical::extended_float::ExtendedFloat;
2cbd624adSopenharmony_ciuse minimal_lexical::rounding;
3cbd624adSopenharmony_ci
4cbd624adSopenharmony_ci#[test]
5cbd624adSopenharmony_cifn round_test() {
6cbd624adSopenharmony_ci    let mut fp = ExtendedFloat {
7cbd624adSopenharmony_ci        mant: 9223372036854776832,
8cbd624adSopenharmony_ci        exp: -10,
9cbd624adSopenharmony_ci    };
10cbd624adSopenharmony_ci    rounding::round::<f64, _>(&mut fp, |f, s| {
11cbd624adSopenharmony_ci        f.mant >>= s;
12cbd624adSopenharmony_ci        f.exp += s;
13cbd624adSopenharmony_ci    });
14cbd624adSopenharmony_ci    assert_eq!(fp.mant, 0);
15cbd624adSopenharmony_ci    assert_eq!(fp.exp, 1);
16cbd624adSopenharmony_ci
17cbd624adSopenharmony_ci    let mut fp = ExtendedFloat {
18cbd624adSopenharmony_ci        mant: 9223372036854776832,
19cbd624adSopenharmony_ci        exp: -10,
20cbd624adSopenharmony_ci    };
21cbd624adSopenharmony_ci    rounding::round::<f64, _>(&mut fp, |f, s| {
22cbd624adSopenharmony_ci        f.mant >>= s;
23cbd624adSopenharmony_ci        f.exp += s;
24cbd624adSopenharmony_ci        // Round-up.
25cbd624adSopenharmony_ci        f.mant += 1;
26cbd624adSopenharmony_ci    });
27cbd624adSopenharmony_ci    assert_eq!(fp.mant, 1);
28cbd624adSopenharmony_ci    assert_eq!(fp.exp, 1);
29cbd624adSopenharmony_ci
30cbd624adSopenharmony_ci    // Round-down
31cbd624adSopenharmony_ci    let mut fp = ExtendedFloat {
32cbd624adSopenharmony_ci        mant: 9223372036854776832,
33cbd624adSopenharmony_ci        exp: -10,
34cbd624adSopenharmony_ci    };
35cbd624adSopenharmony_ci    rounding::round::<f64, _>(&mut fp, |f, s| {
36cbd624adSopenharmony_ci        rounding::round_nearest_tie_even(f, s, |is_odd, is_halfway, is_above| {
37cbd624adSopenharmony_ci            is_above || (is_odd && is_halfway)
38cbd624adSopenharmony_ci        });
39cbd624adSopenharmony_ci    });
40cbd624adSopenharmony_ci    assert_eq!(fp.mant, 0);
41cbd624adSopenharmony_ci    assert_eq!(fp.exp, 1);
42cbd624adSopenharmony_ci
43cbd624adSopenharmony_ci    // Round up
44cbd624adSopenharmony_ci    let mut fp = ExtendedFloat {
45cbd624adSopenharmony_ci        mant: 9223372036854778880,
46cbd624adSopenharmony_ci        exp: -10,
47cbd624adSopenharmony_ci    };
48cbd624adSopenharmony_ci    rounding::round::<f64, _>(&mut fp, |f, s| {
49cbd624adSopenharmony_ci        rounding::round_nearest_tie_even(f, s, |is_odd, is_halfway, is_above| {
50cbd624adSopenharmony_ci            is_above || (is_odd && is_halfway)
51cbd624adSopenharmony_ci        });
52cbd624adSopenharmony_ci    });
53cbd624adSopenharmony_ci    assert_eq!(fp.mant, 2);
54cbd624adSopenharmony_ci    assert_eq!(fp.exp, 1);
55cbd624adSopenharmony_ci
56cbd624adSopenharmony_ci    // Round down
57cbd624adSopenharmony_ci    let mut fp = ExtendedFloat {
58cbd624adSopenharmony_ci        mant: 9223372036854778880,
59cbd624adSopenharmony_ci        exp: -10,
60cbd624adSopenharmony_ci    };
61cbd624adSopenharmony_ci    rounding::round::<f64, _>(&mut fp, rounding::round_down);
62cbd624adSopenharmony_ci    assert_eq!(fp.mant, 1);
63cbd624adSopenharmony_ci    assert_eq!(fp.exp, 1);
64cbd624adSopenharmony_ci}
65