pub type D38<const SCALE: u32> = crate::D<i128, SCALE>;
impl<const SCALE: u32> Default for crate::D<i128, SCALE> {
#[inline]
fn default() -> Self {
Self::ZERO
}
}
pub type D38s0 = D38<0>;
pub type D38s1 = D38<1>;
pub type D38s2 = D38<2>;
pub type D38s3 = D38<3>;
pub type D38s4 = D38<4>;
pub type D38s5 = D38<5>;
pub type D38s6 = D38<6>;
pub type D38s7 = D38<7>;
pub type D38s8 = D38<8>;
pub type D38s9 = D38<9>;
pub type D38s10 = D38<10>;
pub type D38s11 = D38<11>;
pub type D38s12 = D38<12>;
pub type D38s13 = D38<13>;
pub type D38s14 = D38<14>;
pub type D38s15 = D38<15>;
pub type D38s16 = D38<16>;
pub type D38s17 = D38<17>;
pub type D38s18 = D38<18>;
pub type D38s19 = D38<19>;
pub type D38s20 = D38<20>;
pub type D38s21 = D38<21>;
pub type D38s22 = D38<22>;
pub type D38s23 = D38<23>;
pub type D38s24 = D38<24>;
pub type D38s25 = D38<25>;
pub type D38s26 = D38<26>;
pub type D38s27 = D38<27>;
pub type D38s28 = D38<28>;
pub type D38s29 = D38<29>;
pub type D38s30 = D38<30>;
pub type D38s31 = D38<31>;
pub type D38s32 = D38<32>;
pub type D38s33 = D38<33>;
pub type D38s34 = D38<34>;
pub type D38s35 = D38<35>;
pub type D38s36 = D38<36>;
pub type D38s37 = D38<37>;
pub use crate::support::error::ParseError;
crate::macros::basics::decl_decimal_basics!(D38, i128, 37);
crate::macros::display::decl_decimal_display!(D38);
crate::macros::from_str::decl_decimal_from_str!(D38, i128);
crate::macros::storage_formatters::decl_decimal_storage_formatters!(D38);
crate::macros::bitwise::decl_decimal_bitwise!(D38, i128);
crate::macros::int_methods::decl_decimal_int_methods!(D38, i128);
crate::macros::num_traits::decl_decimal_num_traits_conversions!(D38, i128);
crate::macros::float_bridge::decl_decimal_float_bridge!(D38, i128);
crate::macros::conversions::decl_from_primitive!(D38, i128, i8);
crate::macros::conversions::decl_from_primitive!(D38, i128, i16);
crate::macros::conversions::decl_from_primitive!(D38, i128, i32);
crate::macros::conversions::decl_from_primitive!(D38, i128, i64);
crate::macros::conversions::decl_from_primitive!(D38, i128, u8);
crate::macros::conversions::decl_from_primitive!(D38, i128, u16);
crate::macros::conversions::decl_from_primitive!(D38, i128, u32);
crate::macros::conversions::decl_from_primitive!(D38, i128, u64);
crate::macros::conversions::decl_try_from_i128!(D38, i128);
crate::macros::conversions::decl_try_from_u128!(D38, i128);
crate::macros::conversions::decl_try_from_i128!(D18, i64);
crate::macros::conversions::decl_try_from_u128!(D18, i64);
crate::macros::conversions::decl_try_from_i128!(D9, i32);
crate::macros::conversions::decl_try_from_u128!(D9, i32);
crate::macros::conversions::decl_try_from_f64!(D38, i128);
crate::macros::conversions::decl_try_from_f32!(D38, i128);
crate::macros::conversions::decl_try_from_f64!(D18, i64);
crate::macros::conversions::decl_try_from_f32!(D18, i64);
crate::macros::conversions::decl_try_from_f64!(D9, i32);
crate::macros::conversions::decl_try_from_f32!(D9, i32);
crate::macros::conversions::decl_decimal_int_conversion_methods!(D38, i128, i64);
crate::macros::sign::decl_decimal_sign_methods!(D38, i128);
crate::macros::helpers::decl_decimal_helpers!(D38);
crate::macros::rounding_methods::decl_decimal_rounding_methods!(D38);
crate::macros::overflow::decl_decimal_overflow_variants!(@common D38, i128);
crate::macros::arithmetic::decl_decimal_arithmetic!(@common D38, i128);
crate::macros::num_traits::decl_decimal_num_traits_basics!(D38);
crate::macros::transcendental_trait::decl_decimal_transcendental_impl!(D38);
crate::macros::conversions::decl_decimal_int_conversion_methods!(D18, i64, i64);
crate::macros::conversions::decl_decimal_int_conversion_methods!(D9, i32, i32);
impl<const SCALE: u32> D38<SCALE> {
#[inline]
pub fn narrow(self) -> Result<D18<SCALE>, crate::support::error::ConvertError> {
self.try_into()
}
}
pub type D9<const SCALE: u32> = crate::D<i32, SCALE>;
impl<const SCALE: u32> Default for crate::D<i32, SCALE> {
#[inline]
fn default() -> Self {
Self::ZERO
}
}
crate::macros::basics::decl_decimal_basics!(D9, i32, 8);
crate::macros::arithmetic::decl_decimal_arithmetic!(D9, i32, i64);
crate::macros::conversions::decl_from_primitive!(D9, i32, i8);
crate::macros::conversions::decl_from_primitive!(D9, i32, i16);
crate::macros::conversions::decl_from_primitive!(D9, i32, u8);
crate::macros::conversions::decl_from_primitive!(D9, i32, u16);
crate::macros::display::decl_decimal_display!(D9);
crate::macros::overflow::decl_decimal_overflow_variants!(D9, i32, i64);
crate::macros::num_traits::decl_decimal_num_traits_basics!(D9);
crate::macros::sign::decl_decimal_sign_methods!(D9, i32);
crate::macros::consts::decl_decimal_consts!(D9, i32);
crate::macros::from_str::decl_decimal_from_str!(D9, i32);
crate::macros::float_bridge::decl_decimal_float_bridge!(D9, i32);
crate::macros::storage_formatters::decl_decimal_storage_formatters!(D9);
crate::macros::strict_transcendentals::decl_strict_transcendentals_via_d38!(D9);
crate::macros::transcendental_trait::decl_decimal_transcendental_impl!(D9);
crate::macros::fast_transcendentals::decl_fast_transcendentals_via_f64!(D9);
crate::macros::pow::decl_decimal_pow!(D9);
crate::macros::rounding_methods::decl_decimal_rounding_methods!(D9);
crate::macros::helpers::decl_decimal_helpers!(D9);
crate::macros::bitwise::decl_decimal_bitwise!(D9, i32);
crate::macros::int_methods::decl_decimal_int_methods!(D9, i32);
crate::macros::num_traits::decl_decimal_num_traits_conversions!(D9, i32);
pub type D9s0 = D9<0>;
pub type D9s1 = D9<1>;
pub type D9s2 = D9<2>;
pub type D9s3 = D9<3>;
pub type D9s4 = D9<4>;
pub type D9s5 = D9<5>;
pub type D9s6 = D9<6>;
pub type D9s7 = D9<7>;
pub type D9s8 = D9<8>;
pub type D18<const SCALE: u32> = crate::D<i64, SCALE>;
impl<const SCALE: u32> Default for crate::D<i64, SCALE> {
#[inline]
fn default() -> Self {
Self::ZERO
}
}
crate::macros::basics::decl_decimal_basics!(D18, i64, 17);
crate::macros::arithmetic::decl_decimal_arithmetic!(D18, i64, i128);
crate::macros::conversions::decl_from_primitive!(D18, i64, i8);
crate::macros::conversions::decl_from_primitive!(D18, i64, i16);
crate::macros::conversions::decl_from_primitive!(D18, i64, i32);
crate::macros::conversions::decl_from_primitive!(D18, i64, u8);
crate::macros::conversions::decl_from_primitive!(D18, i64, u16);
crate::macros::conversions::decl_from_primitive!(D18, i64, u32);
crate::macros::display::decl_decimal_display!(D18);
crate::macros::overflow::decl_decimal_overflow_variants!(D18, i64, i128);
crate::macros::num_traits::decl_decimal_num_traits_basics!(D18);
crate::macros::sign::decl_decimal_sign_methods!(D18, i64);
crate::macros::consts::decl_decimal_consts!(D18, i64);
crate::macros::from_str::decl_decimal_from_str!(D18, i64);
crate::macros::float_bridge::decl_decimal_float_bridge!(D18, i64);
crate::macros::storage_formatters::decl_decimal_storage_formatters!(D18);
crate::macros::strict_transcendentals::decl_strict_transcendentals_via_d38!(D18);
crate::macros::transcendental_trait::decl_decimal_transcendental_impl!(D18);
crate::macros::fast_transcendentals::decl_fast_transcendentals_via_f64!(D18);
crate::macros::pow::decl_decimal_pow!(D18);
crate::macros::rounding_methods::decl_decimal_rounding_methods!(D18);
crate::macros::helpers::decl_decimal_helpers!(D18);
crate::macros::bitwise::decl_decimal_bitwise!(D18, i64);
crate::macros::int_methods::decl_decimal_int_methods!(D18, i64);
crate::macros::num_traits::decl_decimal_num_traits_conversions!(D18, i64);
crate::macros::conversions::decl_cross_width_widening!(D18, i64, D9, i32);
crate::macros::conversions::decl_cross_width_widening!(D38, i128, D9, i32);
crate::macros::conversions::decl_cross_width_widening!(D38, i128, D18, i64);
crate::macros::conversions::decl_cross_width_narrowing!(D18, i64, D38, i128);
crate::macros::conversions::decl_cross_width_narrowing!(D9, i32, D38, i128);
crate::macros::conversions::decl_cross_width_narrowing!(D9, i32, D18, i64);
impl<const SCALE: u32> D9<SCALE> {
#[inline]
#[must_use]
pub fn widen(self) -> D18<SCALE> {
self.into()
}
}
impl<const SCALE: u32> D18<SCALE> {
#[inline]
#[must_use]
pub fn widen(self) -> D38<SCALE> {
self.into()
}
#[inline]
pub fn narrow(self) -> Result<D9<SCALE>, crate::support::error::ConvertError> {
self.try_into()
}
}
pub type D18s0 = D18<0>;
pub type D18s1 = D18<1>;
pub type D18s2 = D18<2>;
pub type D18s3 = D18<3>;
pub type D18s4 = D18<4>;
pub type D18s5 = D18<5>;
pub type D18s6 = D18<6>;
pub type D18s7 = D18<7>;
pub type D18s8 = D18<8>;
pub type D18s9 = D18<9>;
pub type D18s10 = D18<10>;
pub type D18s11 = D18<11>;
pub type D18s12 = D18<12>;
pub type D18s13 = D18<13>;
pub type D18s14 = D18<14>;
pub type D18s15 = D18<15>;
pub type D18s16 = D18<16>;
pub type D18s17 = D18<17>;
#[cfg(any(feature = "d76", feature = "wide"))]
pub type D76<const SCALE: u32> = crate::D<crate::wide_int::Int256, SCALE>;
#[cfg(any(feature = "d76", feature = "wide"))]
impl<const SCALE: u32> Default for crate::D<crate::wide_int::Int256, SCALE> {
#[inline]
fn default() -> Self {
Self::ZERO
}
}
#[cfg(any(feature = "d76", feature = "wide"))]
crate::macros::full::decl_decimal_full!(
wide D76,
crate::wide_int::I256,
crate::wide_int::U256,
crate::wide_int::I512,
crate::wide_int::Int512,
crate::wide_int::Int1024,
crate::wide_int::Int1024,
wide_trig_d76,
75
);
#[cfg(any(feature = "d76", feature = "wide"))]
crate::macros::conversions::decl_cross_width_widening!(wide D76, crate::wide_int::I256, D9, i32);
#[cfg(any(feature = "d76", feature = "wide"))]
crate::macros::conversions::decl_cross_width_widening!(wide D76, crate::wide_int::I256, D18, i64);
#[cfg(any(feature = "d76", feature = "wide"))]
crate::macros::conversions::decl_cross_width_widening!(wide D76, crate::wide_int::I256, D38, i128);
#[cfg(any(feature = "d76", feature = "wide"))]
crate::macros::conversions::decl_cross_width_narrowing!(wide D38, i128, D76, crate::wide_int::I256);
#[cfg(any(feature = "d76", feature = "wide"))]
crate::macros::conversions::decl_cross_width_narrowing!(wide D18, i64, D76, crate::wide_int::I256);
#[cfg(any(feature = "d76", feature = "wide"))]
crate::macros::conversions::decl_cross_width_narrowing!(wide D9, i32, D76, crate::wide_int::I256);
#[cfg(any(feature = "d76", feature = "wide"))]
impl<const SCALE: u32> D38<SCALE> {
#[inline]
#[must_use]
pub fn widen(self) -> D57<SCALE> {
self.into()
}
}
#[cfg(any(feature = "d76", feature = "wide"))]
impl<const SCALE: u32> D76<SCALE> {
#[inline]
pub fn narrow(self) -> Result<D57<SCALE>, crate::support::error::ConvertError> {
self.try_into()
}
}
#[cfg(any(feature = "d76", feature = "wide"))] pub type D76s0 = D76<0>;
#[cfg(any(feature = "d76", feature = "wide"))] pub type D76s1 = D76<1>;
#[cfg(any(feature = "d76", feature = "wide"))] pub type D76s2 = D76<2>;
#[cfg(any(feature = "d76", feature = "wide"))] pub type D76s3 = D76<3>;
#[cfg(any(feature = "d76", feature = "wide"))] pub type D76s4 = D76<4>;
#[cfg(any(feature = "d76", feature = "wide"))] pub type D76s6 = D76<6>;
#[cfg(any(feature = "d76", feature = "wide"))] pub type D76s9 = D76<9>;
#[cfg(any(feature = "d76", feature = "wide"))] pub type D76s12 = D76<12>;
#[cfg(any(feature = "d76", feature = "wide"))] pub type D76s15 = D76<15>;
#[cfg(any(feature = "d76", feature = "wide"))] pub type D76s18 = D76<18>;
#[cfg(any(feature = "d76", feature = "wide"))] pub type D76s20 = D76<20>;
#[cfg(any(feature = "d76", feature = "wide"))] pub type D76s24 = D76<24>;
#[cfg(any(feature = "d76", feature = "wide"))] pub type D76s28 = D76<28>;
#[cfg(any(feature = "d76", feature = "wide"))] pub type D76s32 = D76<32>;
#[cfg(any(feature = "d76", feature = "wide"))] pub type D76s35 = D76<35>;
#[cfg(any(feature = "d76", feature = "wide"))] pub type D76s38 = D76<38>;
#[cfg(any(feature = "d76", feature = "wide"))] pub type D76s42 = D76<42>;
#[cfg(any(feature = "d76", feature = "wide"))] pub type D76s48 = D76<48>;
#[cfg(any(feature = "d76", feature = "wide"))] pub type D76s50 = D76<50>;
#[cfg(any(feature = "d76", feature = "wide"))] pub type D76s56 = D76<56>;
#[cfg(any(feature = "d76", feature = "wide"))] pub type D76s64 = D76<64>;
#[cfg(any(feature = "d76", feature = "wide"))] pub type D76s70 = D76<70>;
#[cfg(any(feature = "d76", feature = "wide"))] pub type D76s75 = D76<75>;
#[cfg(any(feature = "d153", feature = "wide"))]
pub type D153<const SCALE: u32> = crate::D<crate::wide_int::Int512, SCALE>;
#[cfg(any(feature = "d153", feature = "wide"))]
impl<const SCALE: u32> Default for crate::D<crate::wide_int::Int512, SCALE> {
#[inline]
fn default() -> Self {
Self::ZERO
}
}
#[cfg(any(feature = "d153", feature = "wide"))]
crate::macros::full::decl_decimal_full!(
wide D153,
crate::wide_int::I512,
crate::wide_int::U512,
crate::wide_int::I1024,
crate::wide_int::Int1024,
crate::wide_int::Int2048,
crate::wide_int::Int2048,
wide_trig_d153,
152
);
#[cfg(any(feature = "d153", feature = "wide"))]
crate::macros::conversions::decl_cross_width_widening!(wide D153, crate::wide_int::I512, D38, i128);
#[cfg(all(any(feature = "d153", feature = "wide"), any(feature = "d76", feature = "wide")))]
crate::macros::conversions::decl_cross_width_widening!(wide D153, crate::wide_int::I512, D76, crate::wide_int::I256);
#[cfg(all(any(feature = "d153", feature = "wide"), any(feature = "d76", feature = "wide")))]
crate::macros::conversions::decl_cross_width_narrowing!(wide D76, crate::wide_int::I256, D153, crate::wide_int::I512);
#[cfg(any(feature = "d153", feature = "wide"))]
crate::macros::conversions::decl_cross_width_narrowing!(wide D38, i128, D153, crate::wide_int::I512);
#[cfg(all(any(feature = "d76", feature = "wide"), any(feature = "d115", feature = "wide")))]
impl<const SCALE: u32> D76<SCALE> {
#[inline]
#[must_use]
pub fn widen(self) -> D115<SCALE> {
self.into()
}
}
#[cfg(any(feature = "d153", feature = "wide"))]
impl<const SCALE: u32> D153<SCALE> {
#[cfg(any(feature = "d115", feature = "wide"))]
#[inline]
pub fn narrow(self) -> Result<D115<SCALE>, crate::support::error::ConvertError> {
self.try_into()
}
}
#[cfg(any(feature = "d153", feature = "wide"))] pub type D153s0 = D153<0>;
#[cfg(any(feature = "d153", feature = "wide"))] pub type D153s1 = D153<1>;
#[cfg(any(feature = "d153", feature = "wide"))] pub type D153s2 = D153<2>;
#[cfg(any(feature = "d153", feature = "wide"))] pub type D153s4 = D153<4>;
#[cfg(any(feature = "d153", feature = "wide"))] pub type D153s6 = D153<6>;
#[cfg(any(feature = "d153", feature = "wide"))] pub type D153s9 = D153<9>;
#[cfg(any(feature = "d153", feature = "wide"))] pub type D153s12 = D153<12>;
#[cfg(any(feature = "d153", feature = "wide"))] pub type D153s15 = D153<15>;
#[cfg(any(feature = "d153", feature = "wide"))] pub type D153s18 = D153<18>;
#[cfg(any(feature = "d153", feature = "wide"))] pub type D153s20 = D153<20>;
#[cfg(any(feature = "d153", feature = "wide"))] pub type D153s24 = D153<24>;
#[cfg(any(feature = "d153", feature = "wide"))] pub type D153s28 = D153<28>;
#[cfg(any(feature = "d153", feature = "wide"))] pub type D153s32 = D153<32>;
#[cfg(any(feature = "d153", feature = "wide"))] pub type D153s35 = D153<35>;
#[cfg(any(feature = "d153", feature = "wide"))] pub type D153s38 = D153<38>;
#[cfg(any(feature = "d153", feature = "wide"))] pub type D153s50 = D153<50>;
#[cfg(any(feature = "d153", feature = "wide"))] pub type D153s57 = D153<57>;
#[cfg(any(feature = "d153", feature = "wide"))] pub type D153s75 = D153<75>;
#[cfg(any(feature = "d153", feature = "wide"))] pub type D153s76 = D153<76>;
#[cfg(any(feature = "d153", feature = "wide"))] pub type D153s100 = D153<100>;
#[cfg(any(feature = "d153", feature = "wide"))] pub type D153s115 = D153<115>;
#[cfg(any(feature = "d153", feature = "wide"))] pub type D153s140 = D153<140>;
#[cfg(any(feature = "d153", feature = "wide"))] pub type D153s150 = D153<150>;
#[cfg(any(feature = "d153", feature = "wide"))] pub type D153s152 = D153<152>;
#[cfg(any(feature = "d307", feature = "wide"))]
pub type D307<const SCALE: u32> = crate::D<crate::wide_int::Int1024, SCALE>;
#[cfg(any(feature = "d307", feature = "wide"))]
impl<const SCALE: u32> Default for crate::D<crate::wide_int::Int1024, SCALE> {
#[inline]
fn default() -> Self {
Self::ZERO
}
}
#[cfg(any(feature = "d307", feature = "wide"))]
crate::macros::full::decl_decimal_full!(
wide D307,
crate::wide_int::I1024,
crate::wide_int::U1024,
crate::wide_int::I2048,
crate::wide_int::Int2048,
crate::wide_int::Int4096,
crate::wide_int::Int4096,
wide_trig_d307,
306
);
#[cfg(all(any(feature = "d307", feature = "wide"), any(feature = "d76", feature = "wide")))]
crate::macros::conversions::decl_cross_width_widening!(wide D307, crate::wide_int::I1024, D76, crate::wide_int::I256);
#[cfg(all(any(feature = "d307", feature = "wide"), any(feature = "d153", feature = "wide")))]
crate::macros::conversions::decl_cross_width_widening!(wide D307, crate::wide_int::I1024, D153, crate::wide_int::I512);
#[cfg(all(any(feature = "d307", feature = "wide"), any(feature = "d153", feature = "wide")))]
crate::macros::conversions::decl_cross_width_narrowing!(wide D153, crate::wide_int::I512, D307, crate::wide_int::I1024);
#[cfg(all(any(feature = "d307", feature = "wide"), any(feature = "d76", feature = "wide")))]
crate::macros::conversions::decl_cross_width_narrowing!(wide D76, crate::wide_int::I256, D307, crate::wide_int::I1024);
#[cfg(all(any(feature = "d153", feature = "wide"), any(feature = "d230", feature = "wide")))]
impl<const SCALE: u32> D153<SCALE> {
#[inline]
#[must_use]
pub fn widen(self) -> D230<SCALE> {
self.into()
}
}
#[cfg(any(feature = "d307", feature = "wide"))]
impl<const SCALE: u32> D307<SCALE> {
#[cfg(any(feature = "d230", feature = "wide"))]
#[inline]
pub fn narrow(self) -> Result<D230<SCALE>, crate::support::error::ConvertError> {
self.try_into()
}
#[cfg(any(feature = "d462", feature = "x-wide"))]
#[inline]
#[must_use]
pub fn widen(self) -> D462<SCALE> {
self.into()
}
}
#[cfg(any(feature = "d307", feature = "wide"))] pub type D307s0 = D307<0>;
#[cfg(any(feature = "d307", feature = "wide"))] pub type D307s1 = D307<1>;
#[cfg(any(feature = "d307", feature = "wide"))] pub type D307s2 = D307<2>;
#[cfg(any(feature = "d307", feature = "wide"))] pub type D307s4 = D307<4>;
#[cfg(any(feature = "d307", feature = "wide"))] pub type D307s6 = D307<6>;
#[cfg(any(feature = "d307", feature = "wide"))] pub type D307s9 = D307<9>;
#[cfg(any(feature = "d307", feature = "wide"))] pub type D307s12 = D307<12>;
#[cfg(any(feature = "d307", feature = "wide"))] pub type D307s15 = D307<15>;
#[cfg(any(feature = "d307", feature = "wide"))] pub type D307s18 = D307<18>;
#[cfg(any(feature = "d307", feature = "wide"))] pub type D307s20 = D307<20>;
#[cfg(any(feature = "d307", feature = "wide"))] pub type D307s24 = D307<24>;
#[cfg(any(feature = "d307", feature = "wide"))] pub type D307s28 = D307<28>;
#[cfg(any(feature = "d307", feature = "wide"))] pub type D307s32 = D307<32>;
#[cfg(any(feature = "d307", feature = "wide"))] pub type D307s35 = D307<35>;
#[cfg(any(feature = "d307", feature = "wide"))] pub type D307s38 = D307<38>;
#[cfg(any(feature = "d307", feature = "wide"))] pub type D307s50 = D307<50>;
#[cfg(any(feature = "d307", feature = "wide"))] pub type D307s75 = D307<75>;
#[cfg(any(feature = "d307", feature = "wide"))] pub type D307s100 = D307<100>;
#[cfg(any(feature = "d307", feature = "wide"))] pub type D307s115 = D307<115>;
#[cfg(any(feature = "d307", feature = "wide"))] pub type D307s150 = D307<150>;
#[cfg(any(feature = "d307", feature = "wide"))] pub type D307s153 = D307<153>;
#[cfg(any(feature = "d307", feature = "wide"))] pub type D307s200 = D307<200>;
#[cfg(any(feature = "d307", feature = "wide"))] pub type D307s230 = D307<230>;
#[cfg(any(feature = "d307", feature = "wide"))] pub type D307s275 = D307<275>;
#[cfg(any(feature = "d307", feature = "wide"))] pub type D307s300 = D307<300>;
#[cfg(any(feature = "d307", feature = "wide"))] pub type D307s306 = D307<306>;
#[cfg(any(feature = "d57", feature = "wide"))]
pub type D57<const SCALE: u32> = crate::D<crate::wide_int::Int192, SCALE>;
#[cfg(any(feature = "d57", feature = "wide"))]
impl<const SCALE: u32> Default for crate::D<crate::wide_int::Int192, SCALE> {
#[inline]
fn default() -> Self { Self::ZERO }
}
#[cfg(any(feature = "d57", feature = "wide"))]
crate::macros::full::decl_decimal_full!(
wide D57,
crate::wide_int::I192,
crate::wide_int::U192,
crate::wide_int::I384,
crate::wide_int::Int384,
crate::wide_int::Int512,
crate::wide_int::Int1024,
wide_trig_d57,
56
);
#[cfg(any(feature = "d57", feature = "wide"))]
pub type D57s0 = D57<0>;
#[cfg(any(feature = "d57", feature = "wide"))]
pub type D57s1 = D57<1>;
#[cfg(any(feature = "d57", feature = "wide"))]
pub type D57s2 = D57<2>;
#[cfg(any(feature = "d57", feature = "wide"))]
pub type D57s4 = D57<4>;
#[cfg(any(feature = "d57", feature = "wide"))]
pub type D57s6 = D57<6>;
#[cfg(any(feature = "d57", feature = "wide"))]
pub type D57s9 = D57<9>;
#[cfg(any(feature = "d57", feature = "wide"))]
pub type D57s12 = D57<12>;
#[cfg(any(feature = "d57", feature = "wide"))]
pub type D57s18 = D57<18>;
#[cfg(any(feature = "d57", feature = "wide"))]
pub type D57s20 = D57<20>;
#[cfg(any(feature = "d57", feature = "wide"))]
pub type D57s24 = D57<24>;
#[cfg(any(feature = "d57", feature = "wide"))]
pub type D57s28 = D57<28>;
#[cfg(any(feature = "d57", feature = "wide"))]
pub type D57s32 = D57<32>;
#[cfg(any(feature = "d57", feature = "wide"))]
pub type D57s38 = D57<38>;
#[cfg(any(feature = "d57", feature = "wide"))]
pub type D57s42 = D57<42>;
#[cfg(any(feature = "d57", feature = "wide"))]
pub type D57s48 = D57<48>;
#[cfg(any(feature = "d57", feature = "wide"))]
pub type D57s52 = D57<52>;
#[cfg(any(feature = "d57", feature = "wide"))]
pub type D57s56 = D57<56>;
#[cfg(any(feature = "d115", feature = "wide"))]
pub type D115<const SCALE: u32> = crate::D<crate::wide_int::Int384, SCALE>;
#[cfg(any(feature = "d115", feature = "wide"))]
impl<const SCALE: u32> Default for crate::D<crate::wide_int::Int384, SCALE> {
#[inline]
fn default() -> Self { Self::ZERO }
}
#[cfg(any(feature = "d115", feature = "wide"))]
crate::macros::full::decl_decimal_full!(
wide D115,
crate::wide_int::I384,
crate::wide_int::U384,
crate::wide_int::I768,
crate::wide_int::Int768,
crate::wide_int::Int1024,
crate::wide_int::Int1024,
wide_trig_d115,
114
);
#[cfg(any(feature = "d115", feature = "wide"))]
pub type D115s0 = D115<0>;
#[cfg(any(feature = "d115", feature = "wide"))]
pub type D115s1 = D115<1>;
#[cfg(any(feature = "d115", feature = "wide"))]
pub type D115s4 = D115<4>;
#[cfg(any(feature = "d115", feature = "wide"))]
pub type D115s8 = D115<8>;
#[cfg(any(feature = "d115", feature = "wide"))]
pub type D115s16 = D115<16>;
#[cfg(any(feature = "d115", feature = "wide"))]
pub type D115s24 = D115<24>;
#[cfg(any(feature = "d115", feature = "wide"))]
pub type D115s32 = D115<32>;
#[cfg(any(feature = "d115", feature = "wide"))]
pub type D115s38 = D115<38>;
#[cfg(any(feature = "d115", feature = "wide"))]
pub type D115s50 = D115<50>;
#[cfg(any(feature = "d115", feature = "wide"))]
pub type D115s57 = D115<57>;
#[cfg(any(feature = "d115", feature = "wide"))]
pub type D115s64 = D115<64>;
#[cfg(any(feature = "d115", feature = "wide"))]
pub type D115s76 = D115<76>;
#[cfg(any(feature = "d115", feature = "wide"))]
pub type D115s90 = D115<90>;
#[cfg(any(feature = "d115", feature = "wide"))]
pub type D115s100 = D115<100>;
#[cfg(any(feature = "d115", feature = "wide"))]
pub type D115s110 = D115<110>;
#[cfg(any(feature = "d115", feature = "wide"))]
pub type D115s114 = D115<114>;
#[cfg(any(feature = "d230", feature = "wide"))]
pub type D230<const SCALE: u32> = crate::D<crate::wide_int::Int768, SCALE>;
#[cfg(any(feature = "d230", feature = "wide"))]
impl<const SCALE: u32> Default for crate::D<crate::wide_int::Int768, SCALE> {
#[inline]
fn default() -> Self { Self::ZERO }
}
#[cfg(any(feature = "d230", feature = "wide"))]
crate::macros::full::decl_decimal_full!(
wide D230,
crate::wide_int::I768,
crate::wide_int::U768,
crate::wide_int::I1536,
crate::wide_int::Int1536,
crate::wide_int::Int3072,
crate::wide_int::Int3072,
wide_trig_d230,
229
);
#[cfg(any(feature = "d230", feature = "wide"))]
pub type D230s0 = D230<0>;
#[cfg(any(feature = "d230", feature = "wide"))]
pub type D230s1 = D230<1>;
#[cfg(any(feature = "d230", feature = "wide"))]
pub type D230s6 = D230<6>;
#[cfg(any(feature = "d230", feature = "wide"))]
pub type D230s18 = D230<18>;
#[cfg(any(feature = "d230", feature = "wide"))]
pub type D230s38 = D230<38>;
#[cfg(any(feature = "d230", feature = "wide"))]
pub type D230s57 = D230<57>;
#[cfg(any(feature = "d230", feature = "wide"))]
pub type D230s75 = D230<75>;
#[cfg(any(feature = "d230", feature = "wide"))]
pub type D230s100 = D230<100>;
#[cfg(any(feature = "d230", feature = "wide"))]
pub type D230s115 = D230<115>;
#[cfg(any(feature = "d230", feature = "wide"))]
pub type D230s140 = D230<140>;
#[cfg(any(feature = "d230", feature = "wide"))]
pub type D230s153 = D230<153>;
#[cfg(any(feature = "d230", feature = "wide"))]
pub type D230s175 = D230<175>;
#[cfg(any(feature = "d230", feature = "wide"))]
pub type D230s200 = D230<200>;
#[cfg(any(feature = "d230", feature = "wide"))]
pub type D230s215 = D230<215>;
#[cfg(any(feature = "d230", feature = "wide"))]
pub type D230s225 = D230<225>;
#[cfg(any(feature = "d230", feature = "wide"))]
pub type D230s229 = D230<229>;
#[cfg(any(feature = "d462", feature = "x-wide"))]
pub type D462<const SCALE: u32> = crate::D<crate::wide_int::Int1536, SCALE>;
#[cfg(any(feature = "d462", feature = "x-wide"))]
impl<const SCALE: u32> Default for crate::D<crate::wide_int::Int1536, SCALE> {
#[inline]
fn default() -> Self { Self::ZERO }
}
#[cfg(any(feature = "d462", feature = "x-wide"))]
crate::macros::full::decl_decimal_full!(
wide D462,
crate::wide_int::I1536,
crate::wide_int::U1536,
crate::wide_int::I3072,
crate::wide_int::Int3072,
crate::wide_int::Int4096,
crate::wide_int::Int4096,
wide_trig_d462,
461
);
#[cfg(any(feature = "d462", feature = "x-wide"))]
pub type D462s0 = D462<0>;
#[cfg(any(feature = "d462", feature = "x-wide"))]
pub type D462s1 = D462<1>;
#[cfg(any(feature = "d462", feature = "x-wide"))]
pub type D462s18 = D462<18>;
#[cfg(any(feature = "d462", feature = "x-wide"))]
pub type D462s38 = D462<38>;
#[cfg(any(feature = "d462", feature = "x-wide"))]
pub type D462s75 = D462<75>;
#[cfg(any(feature = "d462", feature = "x-wide"))]
pub type D462s115 = D462<115>;
#[cfg(any(feature = "d462", feature = "x-wide"))]
pub type D462s153 = D462<153>;
#[cfg(any(feature = "d462", feature = "x-wide"))]
pub type D462s200 = D462<200>;
#[cfg(any(feature = "d462", feature = "x-wide"))]
pub type D462s230 = D462<230>;
#[cfg(any(feature = "d462", feature = "x-wide"))]
pub type D462s275 = D462<275>;
#[cfg(any(feature = "d462", feature = "x-wide"))]
pub type D462s307 = D462<307>;
#[cfg(any(feature = "d462", feature = "x-wide"))]
pub type D462s350 = D462<350>;
#[cfg(any(feature = "d462", feature = "x-wide"))]
pub type D462s400 = D462<400>;
#[cfg(any(feature = "d462", feature = "x-wide"))]
pub type D462s440 = D462<440>;
#[cfg(any(feature = "d462", feature = "x-wide"))]
pub type D462s460 = D462<460>;
#[cfg(any(feature = "d462", feature = "x-wide"))]
pub type D462s461 = D462<461>;
#[cfg(any(feature = "d616", feature = "x-wide"))]
pub type D616<const SCALE: u32> = crate::D<crate::wide_int::Int2048, SCALE>;
#[cfg(any(feature = "d616", feature = "x-wide"))]
impl<const SCALE: u32> Default for crate::D<crate::wide_int::Int2048, SCALE> {
#[inline]
fn default() -> Self { Self::ZERO }
}
#[cfg(any(feature = "d616", feature = "x-wide"))]
crate::macros::full::decl_decimal_full!(
wide D616,
crate::wide_int::I2048,
crate::wide_int::U2048,
crate::wide_int::I4096,
crate::wide_int::Int4096,
crate::wide_int::Int8192,
crate::wide_int::Int8192,
wide_trig_d616,
615
);
#[cfg(any(feature = "d616", feature = "x-wide"))]
pub type D616s0 = D616<0>;
#[cfg(any(feature = "d616", feature = "x-wide"))]
pub type D616s1 = D616<1>;
#[cfg(any(feature = "d616", feature = "x-wide"))]
pub type D616s38 = D616<38>;
#[cfg(any(feature = "d616", feature = "x-wide"))]
pub type D616s75 = D616<75>;
#[cfg(any(feature = "d616", feature = "x-wide"))]
pub type D616s115 = D616<115>;
#[cfg(any(feature = "d616", feature = "x-wide"))]
pub type D616s153 = D616<153>;
#[cfg(any(feature = "d616", feature = "x-wide"))]
pub type D616s200 = D616<200>;
#[cfg(any(feature = "d616", feature = "x-wide"))]
pub type D616s230 = D616<230>;
#[cfg(any(feature = "d616", feature = "x-wide"))]
pub type D616s275 = D616<275>;
#[cfg(any(feature = "d616", feature = "x-wide"))]
pub type D616s308 = D616<308>;
#[cfg(any(feature = "d616", feature = "x-wide"))]
pub type D616s380 = D616<380>;
#[cfg(any(feature = "d616", feature = "x-wide"))]
pub type D616s462 = D616<462>;
#[cfg(any(feature = "d616", feature = "x-wide"))]
pub type D616s500 = D616<500>;
#[cfg(any(feature = "d616", feature = "x-wide"))]
pub type D616s555 = D616<555>;
#[cfg(any(feature = "d616", feature = "x-wide"))]
pub type D616s600 = D616<600>;
#[cfg(any(feature = "d616", feature = "x-wide"))]
pub type D616s615 = D616<615>;
#[cfg(any(feature = "d924", feature = "xx-wide"))]
pub type D924<const SCALE: u32> = crate::D<crate::wide_int::Int3072, SCALE>;
#[cfg(any(feature = "d924", feature = "xx-wide"))]
impl<const SCALE: u32> Default for crate::D<crate::wide_int::Int3072, SCALE> {
#[inline]
fn default() -> Self { Self::ZERO }
}
#[cfg(any(feature = "d924", feature = "xx-wide"))]
crate::macros::full::decl_decimal_full!(
wide D924,
crate::wide_int::I3072,
crate::wide_int::U3072,
crate::wide_int::I6144,
crate::wide_int::Int6144,
crate::wide_int::Int12288,
crate::wide_int::Int12288,
wide_trig_d924,
923
);
#[cfg(any(feature = "d924", feature = "xx-wide"))]
pub type D924s0 = D924<0>;
#[cfg(any(feature = "d924", feature = "xx-wide"))]
pub type D924s1 = D924<1>;
#[cfg(any(feature = "d924", feature = "xx-wide"))]
pub type D924s75 = D924<75>;
#[cfg(any(feature = "d924", feature = "xx-wide"))]
pub type D924s153 = D924<153>;
#[cfg(any(feature = "d924", feature = "xx-wide"))]
pub type D924s230 = D924<230>;
#[cfg(any(feature = "d924", feature = "xx-wide"))]
pub type D924s307 = D924<307>;
#[cfg(any(feature = "d924", feature = "xx-wide"))]
pub type D924s400 = D924<400>;
#[cfg(any(feature = "d924", feature = "xx-wide"))]
pub type D924s461 = D924<461>;
#[cfg(any(feature = "d924", feature = "xx-wide"))]
pub type D924s462 = D924<462>;
#[cfg(any(feature = "d924", feature = "xx-wide"))]
pub type D924s500 = D924<500>;
#[cfg(any(feature = "d924", feature = "xx-wide"))]
pub type D924s616 = D924<616>;
#[cfg(any(feature = "d924", feature = "xx-wide"))]
pub type D924s700 = D924<700>;
#[cfg(any(feature = "d924", feature = "xx-wide"))]
pub type D924s800 = D924<800>;
#[cfg(any(feature = "d924", feature = "xx-wide"))]
pub type D924s860 = D924<860>;
#[cfg(any(feature = "d924", feature = "xx-wide"))]
pub type D924s900 = D924<900>;
#[cfg(any(feature = "d924", feature = "xx-wide"))]
pub type D924s920 = D924<920>;
#[cfg(any(feature = "d924", feature = "xx-wide"))]
pub type D924s923 = D924<923>;
#[cfg(any(feature = "d1232", feature = "xx-wide"))]
pub type D1232<const SCALE: u32> = crate::D<crate::wide_int::Int4096, SCALE>;
#[cfg(any(feature = "d1232", feature = "xx-wide"))]
impl<const SCALE: u32> Default for crate::D<crate::wide_int::Int4096, SCALE> {
#[inline]
fn default() -> Self { Self::ZERO }
}
#[cfg(any(feature = "d1232", feature = "xx-wide"))]
crate::macros::full::decl_decimal_full!(
wide D1232,
crate::wide_int::I4096,
crate::wide_int::U4096,
crate::wide_int::I8192,
crate::wide_int::Int8192,
crate::wide_int::Int16384,
crate::wide_int::Int16384,
wide_trig_d1232,
1231
);
#[cfg(any(feature = "d1232", feature = "xx-wide"))]
pub type D1232s0 = D1232<0>;
#[cfg(any(feature = "d1232", feature = "xx-wide"))]
pub type D1232s1 = D1232<1>;
#[cfg(any(feature = "d1232", feature = "xx-wide"))]
pub type D1232s75 = D1232<75>;
#[cfg(any(feature = "d1232", feature = "xx-wide"))]
pub type D1232s153 = D1232<153>;
#[cfg(any(feature = "d1232", feature = "xx-wide"))]
pub type D1232s230 = D1232<230>;
#[cfg(any(feature = "d1232", feature = "xx-wide"))]
pub type D1232s307 = D1232<307>;
#[cfg(any(feature = "d1232", feature = "xx-wide"))]
pub type D1232s461 = D1232<461>;
#[cfg(any(feature = "d1232", feature = "xx-wide"))]
pub type D1232s616 = D1232<616>;
#[cfg(any(feature = "d1232", feature = "xx-wide"))]
pub type D1232s700 = D1232<700>;
#[cfg(any(feature = "d1232", feature = "xx-wide"))]
pub type D1232s800 = D1232<800>;
#[cfg(any(feature = "d1232", feature = "xx-wide"))]
pub type D1232s900 = D1232<900>;
#[cfg(any(feature = "d1232", feature = "xx-wide"))]
pub type D1232s924 = D1232<924>;
#[cfg(any(feature = "d1232", feature = "xx-wide"))]
pub type D1232s1000 = D1232<1000>;
#[cfg(any(feature = "d1232", feature = "xx-wide"))]
pub type D1232s1100 = D1232<1100>;
#[cfg(any(feature = "d1232", feature = "xx-wide"))]
pub type D1232s1180 = D1232<1180>;
#[cfg(any(feature = "d1232", feature = "xx-wide"))]
pub type D1232s1220 = D1232<1220>;
#[cfg(any(feature = "d1232", feature = "xx-wide"))]
pub type D1232s1230 = D1232<1230>;
#[cfg(any(feature = "d1232", feature = "xx-wide"))]
pub type D1232s1231 = D1232<1231>;
#[cfg(any(feature = "d57", feature = "wide"))]
crate::macros::conversions::decl_cross_width_widening!(wide D57, crate::wide_int::I192, D38, i128);
#[cfg(any(feature = "d57", feature = "wide"))]
crate::macros::conversions::decl_cross_width_narrowing!(wide D38, i128, D57, crate::wide_int::I192);
#[cfg(all(any(feature = "d57", feature = "wide"), any(feature = "d76", feature = "wide")))]
crate::macros::conversions::decl_cross_width_widening!(wide D76, crate::wide_int::I256, D57, crate::wide_int::I192);
#[cfg(all(any(feature = "d57", feature = "wide"), any(feature = "d76", feature = "wide")))]
crate::macros::conversions::decl_cross_width_narrowing!(wide D57, crate::wide_int::I192, D76, crate::wide_int::I256);
#[cfg(all(any(feature = "d76", feature = "wide"), any(feature = "d115", feature = "wide")))]
crate::macros::conversions::decl_cross_width_widening!(wide D115, crate::wide_int::I384, D76, crate::wide_int::I256);
#[cfg(all(any(feature = "d76", feature = "wide"), any(feature = "d115", feature = "wide")))]
crate::macros::conversions::decl_cross_width_narrowing!(wide D76, crate::wide_int::I256, D115, crate::wide_int::I384);
#[cfg(all(any(feature = "d115", feature = "wide"), any(feature = "d153", feature = "wide")))]
crate::macros::conversions::decl_cross_width_widening!(wide D153, crate::wide_int::I512, D115, crate::wide_int::I384);
#[cfg(all(any(feature = "d115", feature = "wide"), any(feature = "d153", feature = "wide")))]
crate::macros::conversions::decl_cross_width_narrowing!(wide D115, crate::wide_int::I384, D153, crate::wide_int::I512);
#[cfg(all(any(feature = "d153", feature = "wide"), any(feature = "d230", feature = "wide")))]
crate::macros::conversions::decl_cross_width_widening!(wide D230, crate::wide_int::I768, D153, crate::wide_int::I512);
#[cfg(all(any(feature = "d153", feature = "wide"), any(feature = "d230", feature = "wide")))]
crate::macros::conversions::decl_cross_width_narrowing!(wide D153, crate::wide_int::I512, D230, crate::wide_int::I768);
#[cfg(all(any(feature = "d230", feature = "wide"), any(feature = "d307", feature = "wide")))]
crate::macros::conversions::decl_cross_width_widening!(wide D307, crate::wide_int::I1024, D230, crate::wide_int::I768);
#[cfg(all(any(feature = "d230", feature = "wide"), any(feature = "d307", feature = "wide")))]
crate::macros::conversions::decl_cross_width_narrowing!(wide D230, crate::wide_int::I768, D307, crate::wide_int::I1024);
#[cfg(all(any(feature = "d307", feature = "wide"), any(feature = "d462", feature = "x-wide")))]
crate::macros::conversions::decl_cross_width_widening!(wide D462, crate::wide_int::I1536, D307, crate::wide_int::I1024);
#[cfg(all(any(feature = "d307", feature = "wide"), any(feature = "d462", feature = "x-wide")))]
crate::macros::conversions::decl_cross_width_narrowing!(wide D307, crate::wide_int::I1024, D462, crate::wide_int::I1536);
#[cfg(all(any(feature = "d462", feature = "x-wide"), any(feature = "d616", feature = "x-wide")))]
crate::macros::conversions::decl_cross_width_widening!(wide D616, crate::wide_int::I2048, D462, crate::wide_int::I1536);
#[cfg(all(any(feature = "d462", feature = "x-wide"), any(feature = "d616", feature = "x-wide")))]
crate::macros::conversions::decl_cross_width_narrowing!(wide D462, crate::wide_int::I1536, D616, crate::wide_int::I2048);
#[cfg(all(any(feature = "d616", feature = "x-wide"), any(feature = "d924", feature = "xx-wide")))]
crate::macros::conversions::decl_cross_width_widening!(wide D924, crate::wide_int::I3072, D616, crate::wide_int::I2048);
#[cfg(all(any(feature = "d616", feature = "x-wide"), any(feature = "d924", feature = "xx-wide")))]
crate::macros::conversions::decl_cross_width_narrowing!(wide D616, crate::wide_int::I2048, D924, crate::wide_int::I3072);
#[cfg(all(any(feature = "d924", feature = "xx-wide"), any(feature = "d1232", feature = "xx-wide")))]
crate::macros::conversions::decl_cross_width_widening!(wide D1232, crate::wide_int::I4096, D924, crate::wide_int::I3072);
#[cfg(all(any(feature = "d924", feature = "xx-wide"), any(feature = "d1232", feature = "xx-wide")))]
crate::macros::conversions::decl_cross_width_narrowing!(wide D924, crate::wide_int::I3072, D1232, crate::wide_int::I4096);
#[cfg(any(feature = "d57", feature = "wide"))]
impl<const SCALE: u32> D57<SCALE> {
#[inline]
pub fn narrow(self) -> Result<D38<SCALE>, crate::support::error::ConvertError> { self.try_into() }
#[inline] #[must_use]
pub fn widen(self) -> D76<SCALE> { self.into() }
}
#[cfg(any(feature = "d115", feature = "wide"))]
impl<const SCALE: u32> D115<SCALE> {
#[inline]
pub fn narrow(self) -> Result<D76<SCALE>, crate::support::error::ConvertError> { self.try_into() }
#[inline] #[must_use]
pub fn widen(self) -> D153<SCALE> { self.into() }
}
#[cfg(any(feature = "d230", feature = "wide"))]
impl<const SCALE: u32> D230<SCALE> {
#[inline]
pub fn narrow(self) -> Result<D153<SCALE>, crate::support::error::ConvertError> { self.try_into() }
#[inline] #[must_use]
pub fn widen(self) -> D307<SCALE> { self.into() }
}
#[cfg(any(feature = "d462", feature = "x-wide"))]
impl<const SCALE: u32> D462<SCALE> {
#[inline]
pub fn narrow(self) -> Result<D307<SCALE>, crate::support::error::ConvertError> { self.try_into() }
#[inline] #[must_use]
pub fn widen(self) -> D616<SCALE> { self.into() }
}
#[cfg(any(feature = "d616", feature = "x-wide"))]
impl<const SCALE: u32> D616<SCALE> {
#[inline]
pub fn narrow(self) -> Result<D462<SCALE>, crate::support::error::ConvertError> { self.try_into() }
}
#[cfg(all(
any(feature = "d616", feature = "x-wide"),
any(feature = "d924", feature = "xx-wide"),
))]
impl<const SCALE: u32> D616<SCALE> {
#[inline] #[must_use]
pub fn widen(self) -> D924<SCALE> { self.into() }
}
#[cfg(any(feature = "d924", feature = "xx-wide"))]
impl<const SCALE: u32> D924<SCALE> {
#[inline]
pub fn narrow(self) -> Result<D616<SCALE>, crate::support::error::ConvertError> { self.try_into() }
#[inline] #[must_use]
pub fn widen(self) -> D1232<SCALE> { self.into() }
}
#[cfg(any(feature = "d1232", feature = "xx-wide"))]
impl<const SCALE: u32> D1232<SCALE> {
#[inline]
pub fn narrow(self) -> Result<D924<SCALE>, crate::support::error::ConvertError> { self.try_into() }
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn from_bits_to_bits_round_trip() {
let raw: i128 = 1_500_000_000_000;
let v: D38s12 = D38s12::from_bits(raw);
assert_eq!(v.to_bits(), raw);
}
#[test]
fn zero_is_zero_bits() {
assert_eq!(D38s12::ZERO.to_bits(), 0);
}
#[test]
fn equal_by_underlying_bits() {
assert_eq!(
D38s12::from_bits(42_000_000_000_000),
D38s12::from_bits(42_000_000_000_000)
);
assert_ne!(D38s12::from_bits(42), D38s12::from_bits(43));
}
#[test]
fn ord_by_underlying_bits() {
assert!(D38s12::from_bits(1) < D38s12::from_bits(2));
assert!(D38s12::from_bits(-1) < D38s12::from_bits(0));
}
#[test]
fn multiplier_is_ten_to_scale() {
assert_eq!(D38s12::multiplier(), 1_000_000_000_000_i128);
}
#[test]
fn scale_const_matches_type_parameter() {
assert_eq!(D38s12::SCALE, 12);
const N: u32 = D38s12::SCALE;
assert_eq!(N, 12);
}
#[test]
fn scale_method_matches_type_parameter() {
assert_eq!(D38s12::ZERO.scale(), 12);
assert_eq!(D38s12::ONE.scale(), 12);
assert_eq!(D38s12::from_bits(i128::MAX).scale(), 12);
assert_eq!(D38s12::from_bits(-7).scale(), 12);
}
#[test]
fn scale_at_other_scales() {
type D6 = super::D38<6>;
type D0 = super::D38<0>;
type D38 = super::D38<38>;
assert_eq!(D6::SCALE, 6);
assert_eq!(D0::SCALE, 0);
assert_eq!(D38::SCALE, 38);
assert_eq!(D6::ZERO.scale(), 6);
assert_eq!(D0::ZERO.scale(), 0);
assert_eq!(D38::ZERO.scale(), 38);
}
#[test]
fn one_has_scaled_bit_pattern() {
assert_eq!(D38s12::ONE.to_bits(), 1_000_000_000_000_i128);
}
#[test]
fn max_is_i128_max() {
assert_eq!(D38s12::MAX.to_bits(), i128::MAX);
}
#[test]
fn min_is_i128_min() {
assert_eq!(D38s12::MIN.to_bits(), i128::MIN);
}
#[test]
fn one_is_not_zero() {
assert_ne!(D38s12::ONE, D38s12::ZERO);
assert!(D38s12::ONE.is_positive());
}
#[test]
fn multiplier_at_other_scales() {
type D6 = super::D38<6>;
assert_eq!(D6::multiplier(), 1_000_000_i128);
assert_eq!(D6::ONE.to_bits(), 1_000_000_i128);
type D0 = super::D38<0>;
assert_eq!(D0::multiplier(), 1_i128);
assert_eq!(D0::ONE.to_bits(), 1_i128);
}
#[test]
fn d9_basics() {
assert_eq!(super::D9s2::ZERO.to_bits(), 0_i32);
assert_eq!(super::D9s2::ONE.to_bits(), 100_i32);
assert_eq!(super::D9s2::MAX.to_bits(), i32::MAX);
assert_eq!(super::D9s2::MIN.to_bits(), i32::MIN);
assert_eq!(super::D9s2::multiplier(), 100_i32);
assert_eq!(super::D9s2::SCALE, 2);
}
#[test]
fn d18_basics() {
assert_eq!(super::D18s9::ZERO.to_bits(), 0_i64);
assert_eq!(super::D18s9::ONE.to_bits(), 1_000_000_000_i64);
assert_eq!(super::D18s9::multiplier(), 1_000_000_000_i64);
assert_eq!(super::D18s9::SCALE, 9);
}
#[test]
fn d9_arithmetic() {
let a = super::D9s2::from_bits(150); let b = super::D9s2::from_bits(250); assert_eq!((a + b).to_bits(), 400);
assert_eq!((b - a).to_bits(), 100);
assert_eq!((-a).to_bits(), -150);
let x = super::D9s2::from_bits(200); let y = super::D9s2::from_bits(300); assert_eq!((x * y).to_bits(), 600); assert_eq!((y / x).to_bits(), 150); assert_eq!((y % x).to_bits(), 100); }
#[test]
fn d18_arithmetic() {
let a = super::D18s9::from_bits(1_500_000_000); let b = super::D18s9::from_bits(2_500_000_000); assert_eq!((a + b).to_bits(), 4_000_000_000);
assert_eq!((b - a).to_bits(), 1_000_000_000);
assert_eq!((-a).to_bits(), -1_500_000_000);
let x = super::D18s9::from_bits(2_000_000_000); let y = super::D18s9::from_bits(3_000_000_000); assert_eq!((x * y).to_bits(), 6_000_000_000);
assert_eq!((y / x).to_bits(), 1_500_000_000);
assert_eq!((y % x).to_bits(), 1_000_000_000);
}
#[test]
fn d9_display() {
let v: super::D9s2 = super::D9s2::from_bits(150); let s = alloc::format!("{}", v);
assert_eq!(s, "1.50");
let neg: super::D9s2 = super::D9s2::from_bits(-2050); assert_eq!(alloc::format!("{}", neg), "-20.50");
let zero: super::D9s2 = super::D9s2::ZERO;
assert_eq!(alloc::format!("{}", zero), "0.00");
let int_only: super::D9s0 = super::D9s0::from_bits(42);
assert_eq!(alloc::format!("{}", int_only), "42");
}
#[test]
fn d18_display() {
let v: super::D18s9 = super::D18s9::from_bits(1_500_000_000); assert_eq!(alloc::format!("{}", v), "1.500000000");
let neg: super::D18s9 = super::D18s9::from_bits(-1_500_000_000);
assert_eq!(alloc::format!("{}", neg), "-1.500000000");
}
#[test]
fn d9_debug() {
let v: super::D9s2 = super::D9s2::from_bits(150);
let s = alloc::format!("{:?}", v);
assert_eq!(s, "D9<2>(1.50)");
}
#[test]
fn cross_width_widening_d9_to_d18() {
let small: super::D9s2 = super::D9s2::from_bits(150);
let wider: super::D18s2 = small.into();
assert_eq!(wider.to_bits(), 150_i64);
}
#[test]
fn cross_width_widening_d9_to_d38() {
let small: super::D9s2 = super::D9s2::from_bits(-150);
let wider: super::D38s2 = small.into();
assert_eq!(wider.to_bits(), -150_i128);
}
#[test]
fn cross_width_widening_d18_to_d38() {
let mid: super::D18s9 = super::D18s9::from_bits(i64::MAX);
let wider: super::D38s9 = mid.into();
assert_eq!(wider.to_bits(), i64::MAX as i128);
}
#[test]
fn cross_width_narrowing_d38_to_d18_in_range() {
let wide: super::D38s9 = super::D38s9::from_bits(1_500_000_000);
let narrow: super::D18s9 = wide.try_into().unwrap();
assert_eq!(narrow.to_bits(), 1_500_000_000);
}
#[test]
fn cross_width_narrowing_d38_to_d18_out_of_range() {
let wide: super::D38s9 = super::D38s9::from_bits(i128::MAX);
let narrow: Result<super::D18s9, _> = wide.try_into();
assert!(narrow.is_err());
}
#[test]
fn cross_width_narrowing_d18_to_d9_in_range() {
let mid: super::D18s2 = super::D18s2::from_bits(150);
let narrow: super::D9s2 = mid.try_into().unwrap();
assert_eq!(narrow.to_bits(), 150);
}
#[test]
fn cross_width_narrowing_d18_to_d9_out_of_range() {
let mid: super::D18s2 = super::D18s2::from_bits(i64::MAX);
let narrow: Result<super::D9s2, _> = mid.try_into();
assert!(narrow.is_err());
}
#[test]
fn d9_consts() {
if !crate::support::rounding::DEFAULT_IS_HALF_TO_EVEN { return; }
use crate::types::consts::DecimalConstants;
type D9s4 = super::D9<4>;
assert_eq!(D9s4::pi().to_bits(), 31416);
assert_eq!(D9s4::e().to_bits(), 27183);
}
#[test]
fn d9_from_str() {
use core::str::FromStr;
let v = super::D9s2::from_str("1.50").unwrap();
assert_eq!(v.to_bits(), 150);
let neg = super::D9s2::from_str("-20.50").unwrap();
assert_eq!(neg.to_bits(), -2050);
assert!(super::D9s2::from_str("1000000000000.00").is_err());
}
#[test]
fn d18_from_str() {
use core::str::FromStr;
let v = super::D18s9::from_str("1.500000000").unwrap();
assert_eq!(v.to_bits(), 1_500_000_000);
let neg = super::D18s9::from_str("-1.500000000").unwrap();
assert_eq!(neg.to_bits(), -1_500_000_000);
}
#[test]
fn d18_consts() {
if !crate::support::rounding::DEFAULT_IS_HALF_TO_EVEN { return; }
use crate::types::consts::DecimalConstants;
type D18s12 = super::D18<12>;
assert_eq!(D18s12::pi().to_bits(), 3_141_592_653_590);
assert_eq!(D18s12::tau().to_bits(), 6_283_185_307_180);
}
#[cfg(any(feature = "d76", feature = "wide"))]
#[test]
fn d76_basics() {
use crate::types::traits::arithmetic::DecimalArithmetic;
use crate::wide_int::I256;
assert_eq!(super::D76s2::ZERO.to_bits(), I256::from_str_radix("0", 10).unwrap());
assert_eq!(super::D76s2::ONE.to_bits(), I256::from_str_radix("100", 10).unwrap());
assert_eq!(super::D76s2::MAX.to_bits(), I256::MAX);
assert_eq!(super::D76s2::MIN.to_bits(), I256::MIN);
assert_eq!(super::D76s2::multiplier(), I256::from_str_radix("100", 10).unwrap());
assert_eq!(super::D76s2::SCALE, 2);
assert_eq!(super::D76s2::ZERO.scale(), 2);
let m75 = super::D76s75::multiplier();
assert_eq!(
m75,
I256::from_str_radix("1000000000000000000000000000000000000000000000000000000000000000000000000000", 10).unwrap()
);
assert_eq!(<super::D76s12 as DecimalArithmetic>::MAX_SCALE, 75);
let raw = I256::from_str_radix("123456789012345678901234567890", 10).unwrap();
assert_eq!(super::D76s12::from_bits(raw).to_bits(), raw);
}
#[cfg(any(feature = "d76", feature = "wide"))]
#[test]
fn d76_arithmetic() {
type D = super::D76<12>;
let one = D::ONE;
let two = D::from_bits(D::multiplier() + D::multiplier());
let three = D::from_bits(D::multiplier() * crate::wide_int::I256::from_str_radix("3", 10).unwrap());
assert_eq!((one + two), three);
assert_eq!((three - one), two);
assert_eq!((-one).to_bits(), -D::multiplier());
let six = D::from_bits(D::multiplier() * crate::wide_int::I256::from_str_radix("6", 10).unwrap());
assert_eq!((two * three), six);
assert_eq!((six / two), three);
assert_eq!((six % two), D::ZERO);
let mut v = one;
v += two;
assert_eq!(v, three);
v *= two;
assert_eq!(v, six);
v /= two;
assert_eq!(v, three);
v -= one;
assert_eq!(v, two);
v %= two;
assert_eq!(v, D::ZERO);
let half = D::from_bits(D::multiplier() / crate::wide_int::I256::from_str_radix("2", 10).unwrap());
let one_and_half = one + half;
let product = one_and_half * one_and_half;
let expected = D::from_bits(
D::multiplier() * crate::wide_int::I256::from_str_radix("2", 10).unwrap()
+ D::multiplier() / crate::wide_int::I256::from_str_radix("4", 10).unwrap(),
);
assert_eq!(product, expected);
}
#[cfg(any(feature = "d76", feature = "wide"))]
#[test]
fn d76_display() {
type D = super::D76<12>;
let one = D::ONE;
assert_eq!(alloc::format!("{}", one), "1.000000000000");
assert_eq!(alloc::format!("{}", -one), "-1.000000000000");
assert_eq!(alloc::format!("{}", D::ZERO), "0.000000000000");
let half = D::from_bits(D::multiplier() / crate::wide_int::I256::from_str_radix("2", 10).unwrap());
assert_eq!(alloc::format!("{}", half), "0.500000000000");
assert_eq!(alloc::format!("{:?}", one), "D76<12>(1.000000000000)");
let int_only: super::D76<0> = super::D76::<0>::ONE;
assert_eq!(alloc::format!("{}", int_only), "1");
let big = super::D76s75::MAX;
let s = alloc::format!("{}", big);
assert!(s.starts_with("57.8960446"));
assert_eq!(s.len(), "57.".len() + 75);
}
#[cfg(any(feature = "d76", feature = "wide"))]
#[test]
fn d76_sign_and_helpers() {
type D = super::D76<6>;
let neg = -D::ONE;
assert!(neg.is_negative());
assert!(D::ONE.is_positive());
assert!(!D::ZERO.is_positive());
assert_eq!(neg.abs(), D::ONE);
assert_eq!(D::ONE.signum(), D::ONE);
assert_eq!(neg.signum(), neg);
assert_eq!(D::ZERO.signum(), D::ZERO);
let two = D::ONE + D::ONE;
assert_eq!(D::ONE.min(two), D::ONE);
assert_eq!(D::ONE.max(two), two);
assert_eq!(two.clamp(D::ZERO, D::ONE), D::ONE);
assert_eq!(D::ONE.copysign(neg), neg);
assert_eq!(neg.copysign(D::ONE), D::ONE);
let half = D::from_bits(D::multiplier() / crate::wide_int::I256::from_str_radix("2", 10).unwrap());
assert_eq!(two.recip(), half);
}
#[cfg(any(feature = "d76", feature = "wide"))]
#[test]
fn d76_overflow_variants() {
type D = super::D76<2>;
assert_eq!(D::MAX.checked_add(D::ONE), None);
assert_eq!(D::ONE.checked_add(D::ONE), Some(D::ONE + D::ONE));
assert_eq!(D::MAX.saturating_add(D::ONE), D::MAX);
assert_eq!(D::MIN.saturating_sub(D::ONE), D::MIN);
assert_eq!(D::MIN.checked_neg(), None);
assert_eq!(D::ONE.checked_neg(), Some(-D::ONE));
let two = D::ONE + D::ONE;
let three = two + D::ONE;
assert_eq!(two.checked_mul(three), Some(D::from_bits(D::multiplier() * crate::wide_int::I256::from_str_radix("6", 10).unwrap())));
assert_eq!(D::ONE.checked_div(D::ZERO), None);
assert_eq!((three).checked_div(D::ONE), Some(three));
let one_lsb = D::from_bits(crate::wide_int::I256::from_str_radix("1", 10).unwrap());
assert_eq!(D::MAX.wrapping_add(one_lsb), D::MIN);
assert_eq!(D::ONE.overflowing_add(D::ONE), (two, false));
assert_eq!(D::MAX.overflowing_add(D::ONE).1, true);
}
#[cfg(any(feature = "d76", feature = "wide"))]
#[test]
fn d76_consts_and_from_str() {
use crate::types::consts::DecimalConstants;
use core::str::FromStr;
assert_eq!(
super::D76::<12>::pi().to_bits(),
crate::wide_int::I256::from_str_radix("3141592653590", 10).unwrap()
);
assert_eq!(
super::D76::<4>::e().to_bits(),
crate::wide_int::I256::from_str_radix("27183", 10).unwrap()
);
let v = super::D76::<2>::from_str("1.50").unwrap();
assert_eq!(v.to_bits(), crate::wide_int::I256::from_str_radix("150", 10).unwrap());
let neg = super::D76::<2>::from_str("-20.50").unwrap();
assert_eq!(neg.to_bits(), crate::wide_int::I256::from_str_radix("-2050", 10).unwrap());
use ::num_traits::{One, Zero};
assert!(super::D76::<6>::zero().is_zero());
assert!(super::D76::<6>::one().is_one());
}
#[cfg(any(feature = "d76", feature = "wide"))]
#[test]
fn d76_conversions() {
use crate::wide_int::I256;
type D = super::D76<6>;
let from_i32: D = 5i32.into();
assert_eq!(from_i32.to_bits(), I256::from_str_radix("5000000", 10).unwrap());
let from_u64: D = 7u64.into();
assert_eq!(from_u64.to_bits(), I256::from_str_radix("7000000", 10).unwrap());
let from_neg: D = (-3i16).into();
assert_eq!(from_neg.to_bits(), I256::from_str_radix("-3000000", 10).unwrap());
let from_i128 = D::try_from(123i128).unwrap();
assert_eq!(from_i128.to_bits(), I256::from_str_radix("123000000", 10).unwrap());
let from_u128 = D::try_from(u128::MAX).unwrap();
assert_eq!(
from_u128.to_bits(),
I256::from_str_radix("340282366920938463463374607431768211455", 10).unwrap()
* I256::from_str_radix("1000000", 10).unwrap()
);
let from_f64 = D::try_from(2.5f64).unwrap();
assert_eq!(from_f64.to_bits(), I256::from_str_radix("2500000", 10).unwrap());
assert!(D::try_from(f64::NAN).is_err());
assert_eq!(D::from_int(9i128), D::from(9i32));
assert_eq!(D::from_i32(-4), D::from(-4i32));
use crate::support::rounding::RoundingMode;
let two_and_half = D::from_bits(I256::from_str_radix("2500000", 10).unwrap());
assert_eq!(two_and_half.to_int_with(RoundingMode::HalfToEven), 2);
assert_eq!(two_and_half.to_int_with(RoundingMode::HalfAwayFromZero), 3);
assert_eq!(two_and_half.to_int_with(RoundingMode::Ceiling), 3);
assert_eq!(two_and_half.to_int_with(RoundingMode::Floor), 2);
let neg_two_and_half = -two_and_half;
assert_eq!(neg_two_and_half.to_int_with(RoundingMode::Floor), -3);
assert_eq!(neg_two_and_half.to_int_with(RoundingMode::Trunc), -2);
let d38: super::D38s6 = super::D38s6::from_bits(-150);
let widened: super::D76<6> = d38.into();
assert_eq!(widened.to_bits(), I256::from_str_radix("-150", 10).unwrap());
let in_range: super::D76<6> = super::D76::<6>::from_bits(I256::from_str_radix("999", 10).unwrap());
let narrowed: super::D38s6 = in_range.try_into().unwrap();
assert_eq!(narrowed.to_bits(), 999i128);
let out_of_range = super::D76s75::MAX;
let narrow_fail: Result<super::D38<75>, _> = out_of_range.try_into();
assert!(narrow_fail.is_err());
}
#[cfg(any(feature = "d76", feature = "wide"))]
#[test]
fn d76_rescale_rounding_floats() {
use crate::support::rounding::RoundingMode;
use crate::wide_int::I256;
type D6 = super::D76<6>;
let v = D6::from_bits(I256::from_str_radix("1500000", 10).unwrap()); let up: super::D76<9> = v.rescale::<9>();
assert_eq!(up.to_bits(), I256::from_str_radix("1500000000", 10).unwrap());
let down: super::D76<2> = v.rescale::<2>();
assert_eq!(down.to_bits(), I256::from_str_radix("150", 10).unwrap());
let two_p_five = super::D76::<1>::from_bits(I256::from_str_radix("25", 10).unwrap());
let r0: super::D76<0> = two_p_five.rescale_with::<0>(RoundingMode::HalfToEven);
assert_eq!(r0.to_bits(), I256::from_str_radix("2", 10).unwrap());
let r0b: super::D76<0> = two_p_five.rescale_with::<0>(RoundingMode::HalfAwayFromZero);
assert_eq!(r0b.to_bits(), I256::from_str_radix("3", 10).unwrap());
assert_eq!(v.floor(), D6::ONE);
assert_eq!(v.ceil(), D6::ONE + D6::ONE);
assert_eq!(v.round(), D6::ONE + D6::ONE); assert_eq!(v.trunc(), D6::ONE);
assert_eq!(v.fract(), D6::from_bits(I256::from_str_radix("500000", 10).unwrap()));
let neg = -v;
assert_eq!(neg.floor(), -(D6::ONE + D6::ONE));
assert_eq!(neg.ceil(), -D6::ONE);
assert_eq!(neg.round(), -(D6::ONE + D6::ONE));
let from_f = D6::from_f64(2.5);
assert_eq!(from_f.to_bits(), I256::from_str_radix("2500000", 10).unwrap());
assert_eq!(D6::from_f64(f64::NAN), D6::ZERO);
assert_eq!(D6::from_f64(f64::INFINITY), D6::MAX);
let round_trip = D6::ONE.to_f64();
assert!((round_trip - 1.0).abs() < 1e-9);
}
#[cfg(any(feature = "d153", feature = "wide"))]
#[test]
fn d153_smoke() {
use crate::types::traits::arithmetic::DecimalArithmetic;
use crate::wide_int::I512;
type D = super::D153<35>;
assert_eq!(<D as DecimalArithmetic>::MAX_SCALE, 152);
assert_eq!(D::ZERO.to_bits(), I512::from_str_radix("0", 10).unwrap());
let one = D::ONE;
let two = one + one;
let three = two + one;
assert_eq!(two * three, D::from_int(6i128));
assert_eq!((three * two) / two, three);
assert_eq!(alloc::format!("{}", one).len(), "1.".len() + 35);
assert_eq!(D::from_int(5i128).to_int(), 5);
let up: super::D153<150> = one.rescale::<150>();
assert_eq!(up, super::D153::<150>::ONE);
let _ = super::D153s152::multiplier();
}
#[cfg(any(feature = "d307", feature = "wide"))]
#[test]
fn d307_smoke() {
use crate::types::traits::arithmetic::DecimalArithmetic;
use crate::wide_int::I1024;
type D = super::D307<35>;
assert_eq!(<D as DecimalArithmetic>::MAX_SCALE, 306);
let one = D::ONE;
let two = one + one;
let three = two + one;
assert_eq!(two * three, D::from_int(6i128));
assert_eq!((three * two) / two, three);
assert_eq!(D::ZERO.to_bits(), I1024::from_str_radix("0", 10).unwrap());
assert_eq!(alloc::format!("{}", one).len(), "1.".len() + 35);
#[cfg(any(feature = "d76", feature = "wide"))]
{
let small: super::D76<35> = super::D76::<35>::ONE;
let widened: super::D307<35> = small.into();
assert_eq!(widened, D::ONE);
let narrowed: super::D76<35> = widened.try_into().unwrap();
assert_eq!(narrowed, super::D76::<35>::ONE);
}
let _ = super::D307s306::multiplier();
}
#[test]
fn d9_op_assign() {
let mut v = super::D9s2::from_bits(100);
v += super::D9s2::from_bits(50);
assert_eq!(v.to_bits(), 150);
v -= super::D9s2::from_bits(25);
assert_eq!(v.to_bits(), 125);
v *= super::D9s2::from_bits(200); assert_eq!(v.to_bits(), 250);
v /= super::D9s2::from_bits(200); assert_eq!(v.to_bits(), 125);
v %= super::D9s2::from_bits(100);
assert_eq!(v.to_bits(), 25);
}
}