blob: cbf5b100ba0f8ebe29598443fc7959b514c4cfe3 [file]
use super::super::{CastFrom, Float};
#[inline]
pub fn frexp<F: Float>(x: F) -> (F, i32) {
let mut ix = x.to_bits();
let mut ee = x.ex() as i32;
if ee == 0 {
if x == F::ZERO {
return (x, 0);
}
// Subnormals, needs to be normalized first
ix &= F::SIG_MASK;
(ee, ix) = F::normalize(ix);
ix |= x.to_bits() & F::SIGN_MASK;
} else if ee == F::EXP_SAT as i32 {
// inf or NaN
return (x, 0);
}
let e = ee - (F::EXP_BIAS as i32 - 1);
ix &= F::SIGN_MASK | F::SIG_MASK;
ix |= F::Int::cast_from(F::EXP_BIAS - 1) << F::SIG_BITS;
(F::from_bits(ix), e)
}