#![doc(hidden)]
#![cfg(not(feature = "compact"))]
use static_assertions::const_assert;
#[cfg(not(feature = "radix"))]
use crate::bigint::Limb;
use crate::limits::{f32_exponent_limit, f64_exponent_limit, f64_mantissa_limit, u64_power_limit};
#[must_use]
#[inline(always)]
#[cfg(not(feature = "power-of-two"))]
pub const fn get_small_int_power(exponent: usize, radix: u32) -> u64 {
match radix {
5 => get_small_int_power5(exponent),
10 => get_small_int_power10(exponent),
_ => unreachable!(),
}
}
#[must_use]
#[inline(always)]
#[cfg(not(feature = "power-of-two"))]
pub const fn get_small_f32_power(exponent: usize, radix: u32) -> f32 {
_ = radix;
get_small_f32_power10(exponent)
}
#[must_use]
#[inline(always)]
#[cfg(not(feature = "power-of-two"))]
pub const fn get_small_f64_power(exponent: usize, radix: u32) -> f64 {
_ = radix;
get_small_f64_power10(exponent)
}
#[must_use]
#[inline(always)]
#[cfg(not(feature = "radix"))]
pub const fn get_large_int_power(_: u32) -> (&'static [Limb], u32) {
(&LARGE_POW5, LARGE_POW5_STEP)
}
#[must_use]
#[inline(always)]
pub const fn get_small_int_power5(exponent: usize) -> u64 {
SMALL_INT_POW5[exponent]
}
#[must_use]
#[inline(always)]
pub const fn get_small_int_power10(exponent: usize) -> u64 {
SMALL_INT_POW10[exponent]
}
#[must_use]
#[inline(always)]
pub const fn get_small_f32_power10(exponent: usize) -> f32 {
SMALL_F32_POW10[exponent]
}
#[must_use]
#[inline(always)]
pub const fn get_small_f64_power10(exponent: usize) -> f64 {
SMALL_F64_POW10[exponent]
}
pub const SMALL_INT_POW5: [u64; 28] = [
1,
5,
25,
125,
625,
3125,
15625,
78125,
390625,
1953125,
9765625,
48828125,
244140625,
1220703125,
6103515625,
30517578125,
152587890625,
762939453125,
3814697265625,
19073486328125,
95367431640625,
476837158203125,
2384185791015625,
11920928955078125,
59604644775390625,
298023223876953125,
1490116119384765625,
7450580596923828125,
];
const_assert!(SMALL_INT_POW5.len() > f64_mantissa_limit(5) as usize);
const_assert!(SMALL_INT_POW5.len() == u64_power_limit(5) as usize + 1);
pub const SMALL_INT_POW10: [u64; 20] = [
1,
10,
100,
1000,
10000,
100000,
1000000,
10000000,
100000000,
1000000000,
10000000000,
100000000000,
1000000000000,
10000000000000,
100000000000000,
1000000000000000,
10000000000000000,
100000000000000000,
1000000000000000000,
10000000000000000000,
];
const_assert!(SMALL_INT_POW10.len() > f64_mantissa_limit(10) as usize);
const_assert!(SMALL_INT_POW10.len() == u64_power_limit(10) as usize + 1);
pub const SMALL_F32_POW10: [f32; 16] =
[1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10, 0., 0., 0., 0., 0.];
const_assert!(SMALL_F32_POW10.len() > f32_exponent_limit(10).1 as usize);
pub const SMALL_F64_POW10: [f64; 32] = [
1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16,
1e17, 1e18, 1e19, 1e20, 1e21, 1e22, 0., 0., 0., 0., 0., 0., 0., 0., 0.,
];
const_assert!(SMALL_F64_POW10.len() > f64_exponent_limit(10).1 as usize);
#[cfg(not(all(target_pointer_width = "64", not(target_arch = "sparc"))))]
pub const LARGE_POW5: [u32; 10] = [
4279965485, 329373468, 4020270615, 2137533757, 4287402176, 1057042919, 1071430142, 2440757623,
381945767, 46164893,
];
#[cfg(all(target_pointer_width = "64", not(target_arch = "sparc")))]
pub const LARGE_POW5: [u64; 5] = [
1414648277510068013,
9180637584431281687,
4539964771860779200,
10482974169319127550,
198276706040285095,
];
pub const LARGE_POW5_STEP: u32 = 135;