fastnum 0.7.4

Fast decimal numbers library
Documentation
use crate::bint::{
    intrinsics::_ilog10_64,
    uint::{
        intrinsics::Intrinsics,
        math::utils::{as_u128, as_u64},
    },
    UInt,
};

#[inline(always)]
pub const fn ilog10<const N: usize>(n: UInt<N>) -> u32 {
    match N {
        1 => _ilog10_64(as_u64(n)),
        2 => as_u128(n).ilog10(),
        _ => ilog10_long(n),
    }
}

#[inline(always)]
const fn ilog10_long<const N: usize>(n: UInt<N>) -> u32 {
    let res = ((n.ilog2() + 1) * 1233) >> 12;
    if n.lt(&Intrinsics::<N>::unchecked_power_of_ten(res)) {
        res.saturating_sub(1)
    } else {
        res
    }
}