#![cfg(feature = "power-of-two")]
#![cfg(not(feature = "compact"))]
#![doc(hidden)]
#[cfg(not(feature = "radix"))]
use crate::table_decimal::*;
#[cfg(not(feature = "radix"))]
use core::hint;
#[cfg(not(feature = "radix"))]
use lexical_util::assert::debug_assert_radix;
use lexical_util::num::Float;
#[inline]
#[cfg(not(feature = "radix"))]
pub unsafe fn get_small_int_power(exponent: usize, radix: u32) -> u64 {
unsafe {
match radix {
2 => get_small_int_power2(exponent),
4 => get_small_int_power4(exponent),
5 => get_small_int_power5(exponent),
8 => get_small_int_power8(exponent),
10 => get_small_int_power10(exponent),
16 => get_small_int_power16(exponent),
32 => get_small_int_power32(exponent),
_ => hint::unreachable_unchecked(),
}
}
}
#[inline]
#[cfg(not(feature = "radix"))]
pub unsafe fn get_small_f32_power(exponent: usize, radix: u32) -> f32 {
debug_assert_radix(radix);
unsafe {
match radix {
2 => get_small_f32_power2(exponent),
4 => get_small_f32_power4(exponent),
8 => get_small_f32_power8(exponent),
10 => get_small_f32_power10(exponent),
16 => get_small_f32_power16(exponent),
32 => get_small_f32_power32(exponent),
_ => hint::unreachable_unchecked(),
}
}
}
#[inline]
#[cfg(not(feature = "radix"))]
pub unsafe fn get_small_f64_power(exponent: usize, radix: u32) -> f64 {
debug_assert_radix(radix);
unsafe {
match radix {
2 => get_small_f64_power2(exponent),
4 => get_small_f64_power4(exponent),
8 => get_small_f64_power8(exponent),
10 => get_small_f64_power10(exponent),
16 => get_small_f64_power16(exponent),
32 => get_small_f64_power32(exponent),
_ => hint::unreachable_unchecked(),
}
}
}
#[inline(always)]
pub unsafe fn get_small_int_power2(exponent: usize) -> u64 {
1 << exponent
}
#[inline(always)]
pub unsafe fn get_small_f32_power2(exponent: usize) -> f32 {
debug_assert!(exponent as i32 <= f32::EXPONENT_BIAS - f32::MANTISSA_SIZE);
let shift = (f32::EXPONENT_BIAS - f32::MANTISSA_SIZE) as u32;
let bits = (exponent as u32 + shift) << f32::MANTISSA_SIZE;
f32::from_bits(bits)
}
#[inline(always)]
pub unsafe fn get_small_f64_power2(exponent: usize) -> f64 {
debug_assert!(exponent as i32 <= f64::EXPONENT_BIAS - f64::MANTISSA_SIZE);
let shift = (f64::EXPONENT_BIAS - f64::MANTISSA_SIZE) as u64;
let bits = (exponent as u64 + shift) << f64::MANTISSA_SIZE;
f64::from_bits(bits)
}
#[inline(always)]
pub unsafe fn get_small_int_power4(exponent: usize) -> u64 {
unsafe { get_small_int_power2(2 * exponent) }
}
#[inline(always)]
pub unsafe fn get_small_f32_power4(exponent: usize) -> f32 {
unsafe { get_small_f32_power2(2 * exponent) }
}
#[inline(always)]
pub unsafe fn get_small_f64_power4(exponent: usize) -> f64 {
unsafe { get_small_f64_power2(2 * exponent) }
}
#[inline(always)]
pub unsafe fn get_small_int_power8(exponent: usize) -> u64 {
unsafe { get_small_int_power2(3 * exponent) }
}
#[inline(always)]
pub unsafe fn get_small_f32_power8(exponent: usize) -> f32 {
unsafe { get_small_f32_power2(3 * exponent) }
}
#[inline(always)]
pub unsafe fn get_small_f64_power8(exponent: usize) -> f64 {
unsafe { get_small_f64_power2(3 * exponent) }
}
#[inline(always)]
pub unsafe fn get_small_int_power16(exponent: usize) -> u64 {
unsafe { get_small_int_power2(4 * exponent) }
}
#[inline(always)]
pub unsafe fn get_small_f32_power16(exponent: usize) -> f32 {
unsafe { get_small_f32_power2(4 * exponent) }
}
#[inline(always)]
pub unsafe fn get_small_f64_power16(exponent: usize) -> f64 {
unsafe { get_small_f64_power2(4 * exponent) }
}
#[inline(always)]
pub unsafe fn get_small_int_power32(exponent: usize) -> u64 {
unsafe { get_small_int_power2(5 * exponent) }
}
#[inline(always)]
pub unsafe fn get_small_f32_power32(exponent: usize) -> f32 {
unsafe { get_small_f32_power2(5 * exponent) }
}
#[inline(always)]
pub unsafe fn get_small_f64_power32(exponent: usize) -> f64 {
unsafe { get_small_f64_power2(5 * exponent) }
}