fastnum 0.7.4

Fast decimal numbers library
Documentation
use crate::bint::intrinsics::ExpType;

macro_rules! decode_float {
    ($name: ident, $f: ty, $u: ty) => {
        #[inline(always)]
        pub const fn $name(f: $f) -> ($u, i16) {
            const BITS: u32 = core::mem::size_of::<$f>() as u32 * 8;
            const MANT_MASK: $u = <$u>::MAX >> (BITS - (<$f>::MANTISSA_DIGITS - 1));
            const EXP_MASK: $u = <$u>::MAX >> 1;
            const BIAS: i16 = <$f>::MAX_EXP as i16 - 1;

            let bits = f.to_bits();
            let exp = ((bits & EXP_MASK) >> (<$f>::MANTISSA_DIGITS - 1)) as i16;
            let mut mant = bits & MANT_MASK;
            if exp != 0 {
                mant |= (1 << (<$f>::MANTISSA_DIGITS - 1));
            }
            (mant, exp - (BIAS + <$f>::MANTISSA_DIGITS as i16 - 1))
        }
    };
}

decode_float!(decode_f32, f32, u32);
decode_float!(decode_f64, f64, u64);

#[inline(always)]
pub const fn u32_bits(u: u32) -> ExpType {
    32 - u.leading_zeros() as ExpType
}

#[inline(always)]
pub const fn u64_bits(u: u64) -> ExpType {
    64 - u.leading_zeros() as ExpType
}