#![cfg_attr(not(feature = "std"), no_std)]
#![cfg_attr(feature = "experimental-floats", feature(f16, f128))]
#![allow(
// Decimal width names overlap with type prefixes; the lint adds no
// signal here.
clippy::module_name_repetitions,
// We use unindented Markdown continuation in module docs.
clippy::doc_lazy_continuation,
// We routinely place a blank line between a method's `#[cfg]`
// attribute and its doc/body for readability.
clippy::empty_line_after_outer_attr,
// Big-integer arithmetic regularly casts between signed/unsigned
// and between widths. The wraps / truncations / sign flips are
// intentional — `unsigned_abs` paths, two's-complement tricks,
// narrowing the final result back to storage after a widened mul.
clippy::cast_possible_truncation,
clippy::cast_possible_wrap,
clippy::cast_sign_loss,
// We prefer `as` casts over `T::from(x)` in arithmetic-heavy
// inner loops for readability and to match the surrounding
// big-integer idiom.
clippy::cast_lossless,
// Float bridges (`to_f64`, `to_f32`) are explicitly lossy by
// contract. The lint is a tautology here.
clippy::cast_precision_loss,
// Literals like `1_000_000_000_000` carry the scale visually and
// are kept unseparated when they encode `10^SCALE`.
clippy::unreadable_literal,
// `if cond { panic!(…) }` is the crate's canonical bounds-check
// shape; `assert!(…)` would lose the dynamic message.
clippy::manual_assert,
// `Result<_, ()>` is the only honest error type for `const fn`
// digit-validity checks where no allocator is available.
clippy::result_unit_err,
// `if …; if …` chains read more cleanly than `if … && …` in the
// const-fn limb-arithmetic helpers.
clippy::collapsible_if,
// Big-int / fixed-point inner loops use `i`, `j`, `k`, `n`, `m`
// as conventional names. Renaming to `outer_index` etc. hurts
// readability without payoff.
clippy::similar_names,
clippy::many_single_char_names,
// Strict-transcendental kernels exceed 100 lines because they
// unroll a series-evaluation loop; splitting them just to please
// the line-count lint would scatter the algorithm.
clippy::too_many_lines,
// `#[inline(always)]` is set deliberately on small hot-path
clippy::inline_always,
clippy::float_cmp,
clippy::manual_let_else,
clippy::format_push_string,
clippy::comparison_chain,
clippy::must_use_candidate,
clippy::return_self_not_must_use,
clippy::missing_errors_doc,
clippy::missing_panics_doc,
clippy::doc_markdown,
)]
#[cfg(feature = "alloc")]
extern crate alloc;
#[cfg(feature = "perf-trace")]
#[doc(hidden)]
pub use ::tracing;
mod algos;
mod identity;
mod support;
mod types;
#[cfg(feature = "bench-alt")]
#[doc(hidden)]
pub mod __bench_internals {
#[inline(never)]
pub fn limbs_mul(a: &[u128], b: &[u128], out: &mut [u128]) {
crate::wide_int::limbs_mul(a, b, out)
}
#[inline(never)]
pub fn limbs_mul_fast(a: &[u128], b: &[u128], out: &mut [u128]) {
crate::wide_int::limbs_mul_fast(a, b, out)
}
#[inline(never)]
pub fn mul_slice(a: &[u64], b: &[u64], out: &mut [u64]) {
crate::wide_int::limbs_mul_u64(a, b, out)
}
#[inline(never)]
pub fn mul_fixed<const L: usize, const D: usize>(
a: &[u64; L],
b: &[u64; L],
out: &mut [u64; D],
) {
crate::wide_int::limbs_mul_u64_fixed::<L, D>(a, b, out)
}
}
mod macros;
mod wide_int;
mod policy;
#[cfg(feature = "serde")]
pub use crate::support::serde_helpers;
pub use crate::types::consts::DecimalConstants;
pub use crate::types::traits::DecimalArithmetic;
pub use crate::types::traits::DecimalConvert;
pub use crate::types::unified::D;
pub use crate::types::traits::Decimal;
pub use crate::support::error::{ConvertError, ParseError};
pub use crate::support::rounding::RoundingMode;
pub use crate::types::traits::DecimalTranscendental;
#[cfg(feature = "dyn")]
pub use crate::types::traits::dyn_decimal::{DecimalWidth, DynDecimal, RawStorage};
pub use crate::types::widths::{
D38, D38s0, D38s1, D38s2, D38s3, D38s4, D38s5, D38s6, D38s7, D38s8, D38s9, D38s10,
D38s11, D38s12, D38s13, D38s14, D38s15, D38s16, D38s17, D38s18, D38s19, D38s20,
D38s21, D38s22, D38s23, D38s24, D38s25, D38s26, D38s27, D38s28, D38s29, D38s30,
D38s31, D38s32, D38s33, D38s34, D38s35, D38s36, D38s37,
};
pub use crate::types::widths::{
D9, D9s0, D9s1, D9s2, D9s3, D9s4, D9s5, D9s6, D9s7, D9s8,
};
pub use crate::types::widths::{
D18, D18s0, D18s1, D18s2, D18s3, D18s4, D18s5, D18s6, D18s7, D18s8, D18s9, D18s10, D18s11,
D18s12, D18s13, D18s14, D18s15, D18s16, D18s17,
};
#[cfg(any(feature = "d76", feature = "wide"))]
pub use crate::types::widths::{
D76,
D76s0, D76s1, D76s2, D76s3, D76s4, D76s6, D76s9, D76s12, D76s15,
D76s18, D76s20, D76s24, D76s28, D76s32, D76s35, D76s38, D76s42,
D76s48, D76s50, D76s56, D76s64, D76s70, D76s75,
};
#[cfg(any(feature = "d76", feature = "d153", feature = "d307", feature = "wide"))]
pub use wide_int::{
Int256, Int512, Int1024, Int2048, Int4096, Uint256, Uint512, Uint1024, Uint2048, Uint4096,
};
#[cfg(any(feature = "d153", feature = "wide"))]
pub use crate::types::widths::{
D153,
D153s0, D153s1, D153s2, D153s4, D153s6, D153s9, D153s12, D153s15,
D153s18, D153s20, D153s24, D153s28, D153s32, D153s35, D153s38,
D153s50, D153s57, D153s75, D153s76, D153s100, D153s115, D153s140,
D153s150, D153s152,
};
#[cfg(any(feature = "d307", feature = "wide"))]
pub use crate::types::widths::{
D307,
D307s0, D307s1, D307s2, D307s4, D307s6, D307s9, D307s12, D307s15,
D307s18, D307s20, D307s24, D307s28, D307s32, D307s35, D307s38,
D307s50, D307s75, D307s100, D307s115, D307s150, D307s153,
D307s200, D307s230, D307s275, D307s300, D307s306,
};
#[cfg(any(feature = "d57", feature = "wide"))]
pub use crate::types::widths::{
D57,
D57s0, D57s1, D57s2, D57s4, D57s6, D57s9, D57s12, D57s18, D57s20, D57s24,
D57s28, D57s32, D57s38, D57s42, D57s48, D57s52, D57s56,
};
#[cfg(any(feature = "d57", feature = "wide"))]
pub use wide_int::{Int192, Uint192};
#[cfg(any(feature = "d115", feature = "wide"))]
pub use crate::types::widths::{
D115,
D115s0, D115s1, D115s4, D115s8, D115s16, D115s24, D115s32, D115s38, D115s50,
D115s57, D115s64, D115s76, D115s90, D115s100, D115s110, D115s114,
};
#[cfg(any(feature = "d115", feature = "wide"))]
pub use wide_int::{Int384, Uint384};
#[cfg(any(feature = "d230", feature = "wide"))]
pub use crate::types::widths::{
D230,
D230s0, D230s1, D230s6, D230s18, D230s38, D230s57, D230s75, D230s100, D230s115,
D230s140, D230s153, D230s175, D230s200, D230s215, D230s225, D230s229,
};
#[cfg(any(feature = "d230", feature = "wide"))]
pub use wide_int::{Int768, Uint768};
#[cfg(any(feature = "d462", feature = "x-wide"))]
pub use crate::types::widths::{
D462,
D462s0, D462s1, D462s18, D462s38, D462s75, D462s115, D462s153, D462s200, D462s230,
D462s275, D462s307, D462s350, D462s400, D462s440, D462s460, D462s461,
};
#[cfg(any(feature = "d462", feature = "x-wide"))]
pub use wide_int::{Int1536, Uint1536};
#[cfg(any(feature = "d616", feature = "x-wide"))]
pub use crate::types::widths::{
D616,
D616s0, D616s1, D616s38, D616s75, D616s115, D616s153, D616s200, D616s230, D616s275,
D616s308, D616s380, D616s462, D616s500, D616s555, D616s600, D616s615,
};
#[cfg(any(feature = "d924", feature = "xx-wide"))]
pub use crate::types::widths::{
D924,
D924s0, D924s1, D924s75, D924s153, D924s230, D924s307, D924s400, D924s461, D924s462,
D924s500, D924s616, D924s700, D924s800, D924s860, D924s900, D924s920, D924s923,
};
#[cfg(any(feature = "d924", feature = "xx-wide"))]
pub use wide_int::{Int3072, Int6144, Int12288, Uint3072, Uint6144, Uint12288};
#[cfg(any(feature = "d1232", feature = "xx-wide"))]
pub use crate::types::widths::{
D1232,
D1232s0, D1232s1, D1232s75, D1232s153, D1232s230, D1232s307, D1232s461, D1232s616,
D1232s700, D1232s800, D1232s900, D1232s924, D1232s1000, D1232s1100,
D1232s1180, D1232s1220, D1232s1230, D1232s1231,
};
#[cfg(any(feature = "d1232", feature = "xx-wide"))]
pub use wide_int::{Int8192, Int16384, Uint8192, Uint16384};
#[cfg(feature = "macros")]
pub use decimal_scaled_macros::{d9, d18, d38};
#[cfg(all(feature = "macros", any(feature = "d76", feature = "wide")))]
pub use decimal_scaled_macros::d76;
#[cfg(all(feature = "macros", any(feature = "d153", feature = "wide")))]
pub use decimal_scaled_macros::d153;
#[cfg(all(feature = "macros", any(feature = "d307", feature = "wide", feature = "x-wide")))]
pub use decimal_scaled_macros::d307;
#[cfg(all(feature = "macros", any(feature = "d57", feature = "wide")))]
pub use decimal_scaled_macros::d57;
#[cfg(all(feature = "macros", any(feature = "d115", feature = "wide")))]
pub use decimal_scaled_macros::d115;
#[cfg(all(feature = "macros", any(feature = "d230", feature = "wide")))]
pub use decimal_scaled_macros::d230;
#[cfg(all(feature = "macros", any(feature = "d462", feature = "x-wide")))]
pub use decimal_scaled_macros::d462;
#[cfg(all(feature = "macros", any(feature = "d616", feature = "x-wide")))]
pub use decimal_scaled_macros::d616;
#[cfg(all(feature = "macros", any(feature = "d924", feature = "xx-wide")))]
pub use decimal_scaled_macros::d924;
#[cfg(all(feature = "macros", any(feature = "d1232", feature = "xx-wide")))]
pub use decimal_scaled_macros::d1232;
#[cfg(feature = "macros")] #[macro_export]
macro_rules! d9s0 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d9!($v, scale 0 $(, $($rest)*)?) }; }
#[cfg(feature = "macros")] #[macro_export]
macro_rules! d9s2 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d9!($v, scale 2 $(, $($rest)*)?) }; }
#[cfg(feature = "macros")] #[macro_export]
macro_rules! d9s4 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d9!($v, scale 4 $(, $($rest)*)?) }; }
#[cfg(feature = "macros")] #[macro_export]
macro_rules! d9s6 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d9!($v, scale 6 $(, $($rest)*)?) }; }
#[cfg(feature = "macros")] #[macro_export]
macro_rules! d18s0 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d18!($v, scale 0 $(, $($rest)*)?) }; }
#[cfg(feature = "macros")] #[macro_export]
macro_rules! d18s2 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d18!($v, scale 2 $(, $($rest)*)?) }; }
#[cfg(feature = "macros")] #[macro_export]
macro_rules! d18s4 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d18!($v, scale 4 $(, $($rest)*)?) }; }
#[cfg(feature = "macros")] #[macro_export]
macro_rules! d18s6 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d18!($v, scale 6 $(, $($rest)*)?) }; }
#[cfg(feature = "macros")] #[macro_export]
macro_rules! d18s9 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d18!($v, scale 9 $(, $($rest)*)?) }; }
#[cfg(feature = "macros")] #[macro_export]
macro_rules! d18s12 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d18!($v, scale 12 $(, $($rest)*)?) }; }
#[cfg(feature = "macros")] #[macro_export]
macro_rules! d38s0 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d38!($v, scale 0 $(, $($rest)*)?) }; }
#[cfg(feature = "macros")] #[macro_export]
macro_rules! d38s2 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d38!($v, scale 2 $(, $($rest)*)?) }; }
#[cfg(feature = "macros")] #[macro_export]
macro_rules! d38s4 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d38!($v, scale 4 $(, $($rest)*)?) }; }
#[cfg(feature = "macros")] #[macro_export]
macro_rules! d38s6 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d38!($v, scale 6 $(, $($rest)*)?) }; }
#[cfg(feature = "macros")] #[macro_export]
macro_rules! d38s8 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d38!($v, scale 8 $(, $($rest)*)?) }; }
#[cfg(feature = "macros")] #[macro_export]
macro_rules! d38s9 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d38!($v, scale 9 $(, $($rest)*)?) }; }
#[cfg(feature = "macros")] #[macro_export]
macro_rules! d38s12 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d38!($v, scale 12 $(, $($rest)*)?) }; }
#[cfg(feature = "macros")] #[macro_export]
macro_rules! d38s15 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d38!($v, scale 15 $(, $($rest)*)?) }; }
#[cfg(feature = "macros")] #[macro_export]
macro_rules! d38s18 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d38!($v, scale 18 $(, $($rest)*)?) }; }
#[cfg(feature = "macros")] #[macro_export]
macro_rules! d38s24 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d38!($v, scale 24 $(, $($rest)*)?) }; }
#[cfg(feature = "macros")] #[macro_export]
macro_rules! d38s35 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d38!($v, scale 35 $(, $($rest)*)?) }; }
#[cfg(all(feature = "macros", any(feature = "d76", feature = "wide")))] #[macro_export]
macro_rules! d76s0 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d76!($v, scale 0 $(, $($rest)*)?) }; }
#[cfg(all(feature = "macros", any(feature = "d76", feature = "wide")))] #[macro_export]
macro_rules! d76s2 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d76!($v, scale 2 $(, $($rest)*)?) }; }
#[cfg(all(feature = "macros", any(feature = "d76", feature = "wide")))] #[macro_export]
macro_rules! d76s6 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d76!($v, scale 6 $(, $($rest)*)?) }; }
#[cfg(all(feature = "macros", any(feature = "d76", feature = "wide")))] #[macro_export]
macro_rules! d76s12 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d76!($v, scale 12 $(, $($rest)*)?) }; }
#[cfg(all(feature = "macros", any(feature = "d76", feature = "wide")))] #[macro_export]
macro_rules! d76s18 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d76!($v, scale 18 $(, $($rest)*)?) }; }
#[cfg(all(feature = "macros", any(feature = "d76", feature = "wide")))] #[macro_export]
macro_rules! d76s35 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d76!($v, scale 35 $(, $($rest)*)?) }; }
#[cfg(all(feature = "macros", any(feature = "d76", feature = "wide")))] #[macro_export]
macro_rules! d76s50 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d76!($v, scale 50 $(, $($rest)*)?) }; }
#[cfg(all(feature = "macros", any(feature = "d153", feature = "wide")))] #[macro_export]
macro_rules! d153s0 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d153!($v, scale 0 $(, $($rest)*)?) }; }
#[cfg(all(feature = "macros", any(feature = "d153", feature = "wide")))] #[macro_export]
macro_rules! d153s35 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d153!($v, scale 35 $(, $($rest)*)?) }; }
#[cfg(all(feature = "macros", any(feature = "d153", feature = "wide")))] #[macro_export]
macro_rules! d153s75 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d153!($v, scale 75 $(, $($rest)*)?) }; }
#[cfg(all(feature = "macros", any(feature = "d153", feature = "wide")))] #[macro_export]
macro_rules! d153s150 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d153!($v, scale 150 $(, $($rest)*)?) }; }
#[cfg(all(feature = "macros", any(feature = "d307", feature = "wide", feature = "x-wide")))] #[macro_export]
macro_rules! d307s0 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d307!($v, scale 0 $(, $($rest)*)?) }; }
#[cfg(all(feature = "macros", any(feature = "d307", feature = "wide", feature = "x-wide")))] #[macro_export]
macro_rules! d307s35 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d307!($v, scale 35 $(, $($rest)*)?) }; }
#[cfg(all(feature = "macros", any(feature = "d307", feature = "wide", feature = "x-wide")))] #[macro_export]
macro_rules! d307s150 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d307!($v, scale 150 $(, $($rest)*)?) }; }
#[cfg(all(feature = "macros", any(feature = "d307", feature = "wide", feature = "x-wide")))] #[macro_export]
macro_rules! d307s300 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d307!($v, scale 300 $(, $($rest)*)?) }; }