1#![cfg_attr(not(feature = "std"), no_std)]
91#![cfg_attr(feature = "experimental-floats", feature(f16, f128))]
92#![allow(
99 clippy::module_name_repetitions,
102 clippy::doc_lazy_continuation,
104 clippy::empty_line_after_outer_attr,
107 clippy::cast_possible_truncation,
112 clippy::cast_possible_wrap,
113 clippy::cast_sign_loss,
114 clippy::cast_lossless,
118 clippy::cast_precision_loss,
121 clippy::unreadable_literal,
124 clippy::manual_assert,
127 clippy::result_unit_err,
130 clippy::collapsible_if,
133 clippy::similar_names,
137 clippy::many_single_char_names,
138 clippy::too_many_lines,
142 clippy::inline_always,
146 clippy::float_cmp,
150 clippy::manual_let_else,
154 clippy::format_push_string,
156 clippy::comparison_chain,
159 clippy::must_use_candidate,
163 clippy::return_self_not_must_use,
164 clippy::missing_errors_doc,
170 clippy::missing_panics_doc,
171 clippy::doc_markdown,
175)]
176
177#[cfg(feature = "alloc")]
178extern crate alloc;
179
180#[cfg(feature = "perf-trace")]
184#[doc(hidden)]
185pub use ::tracing;
186
187mod algos;
188mod identity;
189mod support;
190mod types;
191#[cfg(feature = "bench-alt")]
192#[doc(hidden)]
193pub mod __bench_internals {
194 #[inline(never)]
195 pub fn limbs_mul(a: &[u128], b: &[u128], out: &mut [u128]) {
196 crate::wide_int::limbs_mul(a, b, out)
197 }
198 #[inline(never)]
199 pub fn limbs_mul_fast(a: &[u128], b: &[u128], out: &mut [u128]) {
200 crate::wide_int::limbs_mul_fast(a, b, out)
201 }
202 #[inline(never)]
203 pub fn mul_slice(a: &[u64], b: &[u64], out: &mut [u64]) {
204 crate::wide_int::limbs_mul_u64(a, b, out)
205 }
206 #[inline(never)]
207 pub fn mul_fixed<const L: usize, const D: usize>(
208 a: &[u64; L],
209 b: &[u64; L],
210 out: &mut [u64; D],
211 ) {
212 crate::wide_int::limbs_mul_u64_fixed::<L, D>(a, b, out)
213 }
214 #[inline(never)]
215 pub fn mul_u64_into<const L: usize, const LP1: usize>(
216 a: &[u64; L],
217 n: u64,
218 out: &mut [u64; LP1],
219 ) {
220 crate::wide_int::limbs_mul_u64_into::<L, LP1>(a, n, out)
221 }
222}
223mod macros;
224
225mod wide_int;
239mod policy;
240
241#[cfg(feature = "serde")]
242pub use crate::support::serde_helpers;
243
244
245pub use crate::types::consts::DecimalConstants;
246pub use crate::types::traits::DecimalArithmetic;
247pub use crate::types::traits::DecimalConvert;
248pub use crate::types::unified::D;
249pub use crate::types::traits::Decimal;
250pub use crate::support::error::{ConvertError, ParseError};
251pub use crate::support::rounding::RoundingMode;
252pub use crate::types::traits::DecimalTranscendental;
253
254#[cfg(feature = "dyn")]
255pub use crate::types::traits::dyn_decimal::{DecimalWidth, DynDecimal, RawStorage};
256
257pub use crate::types::widths::{
260 D38, D38s0, D38s1, D38s2, D38s3, D38s4, D38s5, D38s6, D38s7, D38s8, D38s9, D38s10,
261 D38s11, D38s12, D38s13, D38s14, D38s15, D38s16, D38s17, D38s18, D38s19, D38s20,
262 D38s21, D38s22, D38s23, D38s24, D38s25, D38s26, D38s27, D38s28, D38s29, D38s30,
263 D38s31, D38s32, D38s33, D38s34, D38s35, D38s36, D38s37,
264};
265
266pub use crate::types::widths::{
268 D9, D9s0, D9s1, D9s2, D9s3, D9s4, D9s5, D9s6, D9s7, D9s8,
269};
270
271pub use crate::types::widths::{
273 D18, D18s0, D18s1, D18s2, D18s3, D18s4, D18s5, D18s6, D18s7, D18s8, D18s9, D18s10, D18s11,
274 D18s12, D18s13, D18s14, D18s15, D18s16, D18s17,
275};
276
277#[cfg(any(feature = "d76", feature = "wide"))]
279pub use crate::types::widths::{
280 D76,
281 D76s0, D76s1, D76s2, D76s3, D76s4, D76s6, D76s9, D76s12, D76s15,
282 D76s18, D76s20, D76s24, D76s28, D76s32, D76s35, D76s38, D76s42,
283 D76s48, D76s50, D76s56, D76s64, D76s70, D76s75,
284};
285
286#[cfg(any(feature = "d76", feature = "d153", feature = "d307", feature = "wide"))]
289pub use wide_int::{
290 Int256, Int512, Int1024, Int2048, Int4096, Uint256, Uint512, Uint1024, Uint2048, Uint4096,
291};
292
293#[cfg(any(feature = "d153", feature = "wide"))]
295pub use crate::types::widths::{
296 D153,
297 D153s0, D153s1, D153s2, D153s4, D153s6, D153s9, D153s12, D153s15,
298 D153s18, D153s20, D153s24, D153s28, D153s32, D153s35, D153s38,
299 D153s50, D153s57, D153s75, D153s76, D153s100, D153s115, D153s140,
300 D153s150, D153s152,
301};
302
303#[cfg(any(feature = "d307", feature = "wide"))]
305pub use crate::types::widths::{
306 D307,
307 D307s0, D307s1, D307s2, D307s4, D307s6, D307s9, D307s12, D307s15,
308 D307s18, D307s20, D307s24, D307s28, D307s32, D307s35, D307s38,
309 D307s50, D307s75, D307s100, D307s115, D307s150, D307s153,
310 D307s200, D307s230, D307s275, D307s300, D307s306,
311};
312
313#[cfg(any(feature = "d57", feature = "wide"))]
317pub use crate::types::widths::{
318 D57,
319 D57s0, D57s1, D57s2, D57s4, D57s6, D57s9, D57s12, D57s18, D57s20, D57s24,
320 D57s28, D57s32, D57s38, D57s42, D57s48, D57s52, D57s56,
321};
322#[cfg(any(feature = "d57", feature = "wide"))]
323pub use wide_int::{Int192, Uint192};
324
325#[cfg(any(feature = "d115", feature = "wide"))]
327pub use crate::types::widths::{
328 D115,
329 D115s0, D115s1, D115s4, D115s8, D115s16, D115s24, D115s32, D115s38, D115s50,
330 D115s57, D115s64, D115s76, D115s90, D115s100, D115s110, D115s114,
331};
332#[cfg(any(feature = "d115", feature = "wide"))]
333pub use wide_int::{Int384, Uint384};
334
335#[cfg(any(feature = "d230", feature = "wide"))]
337pub use crate::types::widths::{
338 D230,
339 D230s0, D230s1, D230s6, D230s18, D230s38, D230s57, D230s75, D230s100, D230s115,
340 D230s140, D230s153, D230s175, D230s200, D230s215, D230s225, D230s229,
341};
342#[cfg(any(feature = "d230", feature = "wide"))]
343pub use wide_int::{Int768, Uint768};
344
345#[cfg(any(feature = "d462", feature = "x-wide"))]
347pub use crate::types::widths::{
348 D462,
349 D462s0, D462s1, D462s18, D462s38, D462s75, D462s115, D462s153, D462s200, D462s230,
350 D462s275, D462s307, D462s350, D462s400, D462s440, D462s460, D462s461,
351};
352#[cfg(any(feature = "d462", feature = "x-wide"))]
353pub use wide_int::{Int1536, Uint1536};
354
355#[cfg(any(feature = "d616", feature = "x-wide"))]
359pub use crate::types::widths::{
360 D616,
361 D616s0, D616s1, D616s38, D616s75, D616s115, D616s153, D616s200, D616s230, D616s275,
362 D616s308, D616s380, D616s462, D616s500, D616s555, D616s600, D616s615,
363};
364
365#[cfg(any(feature = "d924", feature = "xx-wide"))]
367pub use crate::types::widths::{
368 D924,
369 D924s0, D924s1, D924s75, D924s153, D924s230, D924s307, D924s400, D924s461, D924s462,
370 D924s500, D924s616, D924s700, D924s800, D924s860, D924s900, D924s920, D924s923,
371};
372#[cfg(any(feature = "d924", feature = "xx-wide"))]
373pub use wide_int::{Int3072, Int6144, Int12288, Uint3072, Uint6144, Uint12288};
374
375#[cfg(any(feature = "d1232", feature = "xx-wide"))]
377pub use crate::types::widths::{
378 D1232,
379 D1232s0, D1232s1, D1232s75, D1232s153, D1232s230, D1232s307, D1232s461, D1232s616,
380 D1232s700, D1232s800, D1232s900, D1232s924, D1232s1000, D1232s1100,
381 D1232s1180, D1232s1220, D1232s1230, D1232s1231,
382};
383#[cfg(any(feature = "d1232", feature = "xx-wide"))]
384pub use wide_int::{Int8192, Int16384, Uint8192, Uint16384};
385
386#[cfg(feature = "macros")]
392pub use decimal_scaled_macros::{d9, d18, d38};
393
394#[cfg(all(feature = "macros", any(feature = "d76", feature = "wide")))]
395pub use decimal_scaled_macros::d76;
396
397#[cfg(all(feature = "macros", any(feature = "d153", feature = "wide")))]
398pub use decimal_scaled_macros::d153;
399
400#[cfg(all(feature = "macros", any(feature = "d307", feature = "wide", feature = "x-wide")))]
401pub use decimal_scaled_macros::d307;
402
403#[cfg(all(feature = "macros", any(feature = "d57", feature = "wide")))]
404pub use decimal_scaled_macros::d57;
405
406#[cfg(all(feature = "macros", any(feature = "d115", feature = "wide")))]
407pub use decimal_scaled_macros::d115;
408
409#[cfg(all(feature = "macros", any(feature = "d230", feature = "wide")))]
410pub use decimal_scaled_macros::d230;
411
412#[cfg(all(feature = "macros", any(feature = "d462", feature = "x-wide")))]
413pub use decimal_scaled_macros::d462;
414
415#[cfg(all(feature = "macros", any(feature = "d616", feature = "x-wide")))]
416pub use decimal_scaled_macros::d616;
417
418#[cfg(all(feature = "macros", any(feature = "d924", feature = "xx-wide")))]
419pub use decimal_scaled_macros::d924;
420
421#[cfg(all(feature = "macros", any(feature = "d1232", feature = "xx-wide")))]
422pub use decimal_scaled_macros::d1232;
423
424#[cfg(feature = "macros")] #[macro_export]
438macro_rules! d9s0 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d9!($v, scale 0 $(, $($rest)*)?) }; }
439#[cfg(feature = "macros")] #[macro_export]
441macro_rules! d9s2 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d9!($v, scale 2 $(, $($rest)*)?) }; }
442#[cfg(feature = "macros")] #[macro_export]
444macro_rules! d9s4 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d9!($v, scale 4 $(, $($rest)*)?) }; }
445#[cfg(feature = "macros")] #[macro_export]
447macro_rules! d9s6 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d9!($v, scale 6 $(, $($rest)*)?) }; }
448
449#[cfg(feature = "macros")] #[macro_export]
452macro_rules! d18s0 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d18!($v, scale 0 $(, $($rest)*)?) }; }
453#[cfg(feature = "macros")] #[macro_export]
455macro_rules! d18s2 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d18!($v, scale 2 $(, $($rest)*)?) }; }
456#[cfg(feature = "macros")] #[macro_export]
458macro_rules! d18s4 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d18!($v, scale 4 $(, $($rest)*)?) }; }
459#[cfg(feature = "macros")] #[macro_export]
461macro_rules! d18s6 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d18!($v, scale 6 $(, $($rest)*)?) }; }
462#[cfg(feature = "macros")] #[macro_export]
464macro_rules! d18s9 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d18!($v, scale 9 $(, $($rest)*)?) }; }
465#[cfg(feature = "macros")] #[macro_export]
467macro_rules! d18s12 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d18!($v, scale 12 $(, $($rest)*)?) }; }
468
469#[cfg(feature = "macros")] #[macro_export]
472macro_rules! d38s0 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d38!($v, scale 0 $(, $($rest)*)?) }; }
473#[cfg(feature = "macros")] #[macro_export]
475macro_rules! d38s2 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d38!($v, scale 2 $(, $($rest)*)?) }; }
476#[cfg(feature = "macros")] #[macro_export]
478macro_rules! d38s4 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d38!($v, scale 4 $(, $($rest)*)?) }; }
479#[cfg(feature = "macros")] #[macro_export]
481macro_rules! d38s6 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d38!($v, scale 6 $(, $($rest)*)?) }; }
482#[cfg(feature = "macros")] #[macro_export]
484macro_rules! d38s8 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d38!($v, scale 8 $(, $($rest)*)?) }; }
485#[cfg(feature = "macros")] #[macro_export]
487macro_rules! d38s9 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d38!($v, scale 9 $(, $($rest)*)?) }; }
488#[cfg(feature = "macros")] #[macro_export]
490macro_rules! d38s12 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d38!($v, scale 12 $(, $($rest)*)?) }; }
491#[cfg(feature = "macros")] #[macro_export]
493macro_rules! d38s15 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d38!($v, scale 15 $(, $($rest)*)?) }; }
494#[cfg(feature = "macros")] #[macro_export]
496macro_rules! d38s18 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d38!($v, scale 18 $(, $($rest)*)?) }; }
497#[cfg(feature = "macros")] #[macro_export]
499macro_rules! d38s24 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d38!($v, scale 24 $(, $($rest)*)?) }; }
500#[cfg(feature = "macros")] #[macro_export]
502macro_rules! d38s35 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d38!($v, scale 35 $(, $($rest)*)?) }; }
503
504#[cfg(all(feature = "macros", any(feature = "d76", feature = "wide")))] #[macro_export]
507macro_rules! d76s0 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d76!($v, scale 0 $(, $($rest)*)?) }; }
508#[cfg(all(feature = "macros", any(feature = "d76", feature = "wide")))] #[macro_export]
510macro_rules! d76s2 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d76!($v, scale 2 $(, $($rest)*)?) }; }
511#[cfg(all(feature = "macros", any(feature = "d76", feature = "wide")))] #[macro_export]
513macro_rules! d76s6 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d76!($v, scale 6 $(, $($rest)*)?) }; }
514#[cfg(all(feature = "macros", any(feature = "d76", feature = "wide")))] #[macro_export]
516macro_rules! d76s12 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d76!($v, scale 12 $(, $($rest)*)?) }; }
517#[cfg(all(feature = "macros", any(feature = "d76", feature = "wide")))] #[macro_export]
519macro_rules! d76s18 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d76!($v, scale 18 $(, $($rest)*)?) }; }
520#[cfg(all(feature = "macros", any(feature = "d76", feature = "wide")))] #[macro_export]
522macro_rules! d76s35 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d76!($v, scale 35 $(, $($rest)*)?) }; }
523#[cfg(all(feature = "macros", any(feature = "d76", feature = "wide")))] #[macro_export]
525macro_rules! d76s50 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d76!($v, scale 50 $(, $($rest)*)?) }; }
526
527#[cfg(all(feature = "macros", any(feature = "d153", feature = "wide")))] #[macro_export]
530macro_rules! d153s0 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d153!($v, scale 0 $(, $($rest)*)?) }; }
531#[cfg(all(feature = "macros", any(feature = "d153", feature = "wide")))] #[macro_export]
533macro_rules! d153s35 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d153!($v, scale 35 $(, $($rest)*)?) }; }
534#[cfg(all(feature = "macros", any(feature = "d153", feature = "wide")))] #[macro_export]
536macro_rules! d153s75 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d153!($v, scale 75 $(, $($rest)*)?) }; }
537#[cfg(all(feature = "macros", any(feature = "d153", feature = "wide")))] #[macro_export]
539macro_rules! d153s150 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d153!($v, scale 150 $(, $($rest)*)?) }; }
540
541#[cfg(all(feature = "macros", any(feature = "d307", feature = "wide", feature = "x-wide")))] #[macro_export]
544macro_rules! d307s0 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d307!($v, scale 0 $(, $($rest)*)?) }; }
545#[cfg(all(feature = "macros", any(feature = "d307", feature = "wide", feature = "x-wide")))] #[macro_export]
547macro_rules! d307s35 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d307!($v, scale 35 $(, $($rest)*)?) }; }
548#[cfg(all(feature = "macros", any(feature = "d307", feature = "wide", feature = "x-wide")))] #[macro_export]
550macro_rules! d307s150 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d307!($v, scale 150 $(, $($rest)*)?) }; }
551#[cfg(all(feature = "macros", any(feature = "d307", feature = "wide", feature = "x-wide")))] #[macro_export]
553macro_rules! d307s300 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d307!($v, scale 300 $(, $($rest)*)?) }; }