blob: 02a7d6b30b10315bf53c7239213e226be3d72b32 [file] [edit]
use super::super::{Float, MinInt};
const FP_ILOGBNAN: i32 = i32::MIN;
const FP_ILOGB0: i32 = FP_ILOGBNAN;
#[inline]
pub fn ilogb<F: Float>(x: F) -> i32 {
let zero = F::Int::ZERO;
let mut i = x.to_bits();
let e = x.ex() as i32;
if e == 0 {
i <<= F::EXP_BITS + 1;
if i == F::Int::ZERO {
force_eval!(0.0 / 0.0);
return FP_ILOGB0;
}
/* subnormal x */
let mut e = -(F::EXP_BIAS as i32);
while i >> (F::BITS - 1) == zero {
e -= 1;
i <<= 1;
}
e
} else if e == F::EXP_SAT as i32 {
force_eval!(0.0 / 0.0);
if i << (F::EXP_BITS + 1) != zero {
FP_ILOGBNAN
} else {
i32::MAX
}
} else {
e - F::EXP_BIAS as i32
}
}