1 const FP_ILOGBNAN: i32 = -1 - 0x7fffffff; 2 const FP_ILOGB0: i32 = FP_ILOGBNAN; 3 4 #[cfg_attr(all(test, assert_no_panic), no_panic::no_panic)] ilogb(x: f64) -> i325pub fn ilogb(x: f64) -> i32 { 6 let mut i: u64 = x.to_bits(); 7 let e = ((i >> 52) & 0x7ff) as i32; 8 9 if e == 0 { 10 i <<= 12; 11 if i == 0 { 12 force_eval!(0.0 / 0.0); 13 return FP_ILOGB0; 14 } 15 /* subnormal x */ 16 let mut e = -0x3ff; 17 while (i >> 63) == 0 { 18 e -= 1; 19 i <<= 1; 20 } 21 e 22 } else if e == 0x7ff { 23 force_eval!(0.0 / 0.0); 24 if (i << 12) != 0 { 25 FP_ILOGBNAN 26 } else { 27 i32::max_value() 28 } 29 } else { 30 e - 0x3ff 31 } 32 } 33