const_soft_float/soft_f32/
floor.rs1use super::SoftF32;
2
3pub const fn floor(x: SoftF32) -> SoftF32 {
7 let mut ui = x.to_bits();
8 let e = (((ui >> 23) as i32) & 0xff) - 0x7f;
9
10 if e >= 23 {
11 return x;
12 }
13 if e >= 0 {
14 let m: u32 = 0x007fffff >> e;
15 if (ui & m) == 0 {
16 return x;
17 }
18 if ui >> 31 != 0 {
20 ui += m;
21 }
22 ui &= !m;
23 } else {
24 if ui >> 31 == 0 {
26 ui = 0;
27 } else if ui << 1 != 0 {
28 return SoftF32(-1.0);
29 }
30 }
31 SoftF32::from_bits(ui)
32}
33
34#[cfg(test)]
35mod tests {
36 use super::*;
37
38 #[test]
39 fn sanity_check() {
40 assert_eq!(floor(SoftF32(0.5)).0, 0.0);
41 assert_eq!(floor(SoftF32(1.1)).0, 1.0);
42 assert_eq!(floor(SoftF32(2.9)).0, 2.0);
43 }
44
45 #[test]
47 fn spec_tests() {
48 assert!(floor(SoftF32(f32::NAN)).0.is_nan());
50 for f in [0.0, -0.0, f32::INFINITY, f32::NEG_INFINITY]
51 .iter()
52 .copied()
53 {
54 assert_eq!(SoftF32(f).floor().0, f);
55 }
56 }
57}