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