| 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) | |
| } |