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}
215mod macros;
216
217mod wide_int;
231mod policy;
232
233#[cfg(feature = "serde")]
234pub use crate::support::serde_helpers;
235
236
237pub use crate::types::consts::DecimalConstants;
238#[allow(deprecated)]
239pub use crate::types::consts::DecimalConsts;
240pub use crate::types::traits::DecimalArithmetic;
241pub use crate::types::traits::DecimalConvert;
242pub use crate::types::unified::D;
243pub use crate::types::traits::Decimal;
244pub use crate::support::error::{ConvertError, ParseError};
245pub use crate::support::rounding::RoundingMode;
246pub use crate::types::traits::DecimalTranscendental;
247
248#[cfg(feature = "dyn")]
249pub use crate::types::traits::dyn_decimal::{DecimalWidth, DynDecimal, RawStorage};
250
251pub use crate::types::widths::{
254 D38, D38s0, D38s1, D38s2, D38s3, D38s4, D38s5, D38s6, D38s7, D38s8, D38s9, D38s10,
255 D38s11, D38s12, D38s13, D38s14, D38s15, D38s16, D38s17, D38s18, D38s19, D38s20,
256 D38s21, D38s22, D38s23, D38s24, D38s25, D38s26, D38s27, D38s28, D38s29, D38s30,
257 D38s31, D38s32, D38s33, D38s34, D38s35, D38s36, D38s37,
258};
259
260pub use crate::types::widths::{
262 D9, D9s0, D9s1, D9s2, D9s3, D9s4, D9s5, D9s6, D9s7, D9s8,
263};
264
265pub use crate::types::widths::{
267 D18, D18s0, D18s1, D18s2, D18s3, D18s4, D18s5, D18s6, D18s7, D18s8, D18s9, D18s10, D18s11,
268 D18s12, D18s13, D18s14, D18s15, D18s16, D18s17,
269};
270
271#[cfg(any(feature = "d76", feature = "wide"))]
273pub use crate::types::widths::{
274 D76,
275 D76s0, D76s1, D76s2, D76s3, D76s4, D76s6, D76s9, D76s12, D76s15,
276 D76s18, D76s20, D76s24, D76s28, D76s32, D76s35, D76s38, D76s42,
277 D76s48, D76s50, D76s56, D76s64, D76s70, D76s75,
278};
279
280#[cfg(any(feature = "d76", feature = "d153", feature = "d307", feature = "wide"))]
283pub use wide_int::{
284 Int256, Int512, Int1024, Int2048, Int4096, Uint256, Uint512, Uint1024, Uint2048, Uint4096,
285};
286
287#[cfg(any(feature = "d153", feature = "wide"))]
289pub use crate::types::widths::{
290 D153,
291 D153s0, D153s1, D153s2, D153s4, D153s6, D153s9, D153s12, D153s15,
292 D153s18, D153s20, D153s24, D153s28, D153s32, D153s35, D153s38,
293 D153s50, D153s57, D153s75, D153s76, D153s100, D153s115, D153s140,
294 D153s150, D153s152,
295};
296
297#[cfg(any(feature = "d307", feature = "wide"))]
299pub use crate::types::widths::{
300 D307,
301 D307s0, D307s1, D307s2, D307s4, D307s6, D307s9, D307s12, D307s15,
302 D307s18, D307s20, D307s24, D307s28, D307s32, D307s35, D307s38,
303 D307s50, D307s75, D307s100, D307s115, D307s150, D307s153,
304 D307s200, D307s230, D307s275, D307s300, D307s306,
305};
306
307#[cfg(any(feature = "d57", feature = "wide"))]
311pub use crate::types::widths::{
312 D57,
313 D57s0, D57s1, D57s2, D57s4, D57s6, D57s9, D57s12, D57s18, D57s20, D57s24,
314 D57s28, D57s32, D57s38, D57s42, D57s48, D57s52, D57s56,
315};
316#[cfg(any(feature = "d57", feature = "wide"))]
317pub use wide_int::{Int192, Uint192};
318
319#[cfg(any(feature = "d115", feature = "wide"))]
321pub use crate::types::widths::{
322 D115,
323 D115s0, D115s1, D115s4, D115s8, D115s16, D115s24, D115s32, D115s38, D115s50,
324 D115s57, D115s64, D115s76, D115s90, D115s100, D115s110, D115s114,
325};
326#[cfg(any(feature = "d115", feature = "wide"))]
327pub use wide_int::{Int384, Uint384};
328
329#[cfg(any(feature = "d230", feature = "wide"))]
331pub use crate::types::widths::{
332 D230,
333 D230s0, D230s1, D230s6, D230s18, D230s38, D230s57, D230s75, D230s100, D230s115,
334 D230s140, D230s153, D230s175, D230s200, D230s215, D230s225, D230s229,
335};
336#[cfg(any(feature = "d230", feature = "wide"))]
337pub use wide_int::{Int768, Uint768};
338
339#[cfg(any(feature = "d462", feature = "x-wide"))]
341pub use crate::types::widths::{
342 D462,
343 D462s0, D462s1, D462s18, D462s38, D462s75, D462s115, D462s153, D462s200, D462s230,
344 D462s275, D462s307, D462s350, D462s400, D462s440, D462s460, D462s461,
345};
346#[cfg(any(feature = "d462", feature = "x-wide"))]
347pub use wide_int::{Int1536, Uint1536};
348
349#[cfg(any(feature = "d616", feature = "x-wide"))]
353pub use crate::types::widths::{
354 D616,
355 D616s0, D616s1, D616s38, D616s75, D616s115, D616s153, D616s200, D616s230, D616s275,
356 D616s308, D616s380, D616s462, D616s500, D616s555, D616s600, D616s615,
357};
358
359#[cfg(any(feature = "d924", feature = "xx-wide"))]
361pub use crate::types::widths::{
362 D924,
363 D924s0, D924s1, D924s75, D924s153, D924s230, D924s307, D924s400, D924s461, D924s462,
364 D924s500, D924s616, D924s700, D924s800, D924s860, D924s900, D924s920, D924s923,
365};
366#[cfg(any(feature = "d924", feature = "xx-wide"))]
367pub use wide_int::{Int3072, Int6144, Int12288, Uint3072, Uint6144, Uint12288};
368
369#[cfg(any(feature = "d1232", feature = "xx-wide"))]
371pub use crate::types::widths::{
372 D1232,
373 D1232s0, D1232s1, D1232s75, D1232s153, D1232s230, D1232s307, D1232s461, D1232s616,
374 D1232s700, D1232s800, D1232s900, D1232s924, D1232s1000, D1232s1100,
375 D1232s1180, D1232s1220, D1232s1230, D1232s1231,
376};
377#[cfg(any(feature = "d1232", feature = "xx-wide"))]
378pub use wide_int::{Int8192, Int16384, Uint8192, Uint16384};
379
380#[cfg(feature = "macros")]
386pub use decimal_scaled_macros::{d9, d18, d38};
387
388#[cfg(all(feature = "macros", any(feature = "d76", feature = "wide")))]
389pub use decimal_scaled_macros::d76;
390
391#[cfg(all(feature = "macros", any(feature = "d153", feature = "wide")))]
392pub use decimal_scaled_macros::d153;
393
394#[cfg(all(feature = "macros", any(feature = "d307", feature = "wide", feature = "x-wide")))]
395pub use decimal_scaled_macros::d307;
396
397#[cfg(all(feature = "macros", any(feature = "d57", feature = "wide")))]
398pub use decimal_scaled_macros::d57;
399
400#[cfg(all(feature = "macros", any(feature = "d115", feature = "wide")))]
401pub use decimal_scaled_macros::d115;
402
403#[cfg(all(feature = "macros", any(feature = "d230", feature = "wide")))]
404pub use decimal_scaled_macros::d230;
405
406#[cfg(all(feature = "macros", any(feature = "d462", feature = "x-wide")))]
407pub use decimal_scaled_macros::d462;
408
409#[cfg(all(feature = "macros", any(feature = "d616", feature = "x-wide")))]
410pub use decimal_scaled_macros::d616;
411
412#[cfg(all(feature = "macros", any(feature = "d924", feature = "xx-wide")))]
413pub use decimal_scaled_macros::d924;
414
415#[cfg(all(feature = "macros", any(feature = "d1232", feature = "xx-wide")))]
416pub use decimal_scaled_macros::d1232;
417
418#[cfg(feature = "macros")] #[macro_export]
432macro_rules! d9s0 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d9!($v, scale 0 $(, $($rest)*)?) }; }
433#[cfg(feature = "macros")] #[macro_export]
435macro_rules! d9s2 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d9!($v, scale 2 $(, $($rest)*)?) }; }
436#[cfg(feature = "macros")] #[macro_export]
438macro_rules! d9s4 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d9!($v, scale 4 $(, $($rest)*)?) }; }
439#[cfg(feature = "macros")] #[macro_export]
441macro_rules! d9s6 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d9!($v, scale 6 $(, $($rest)*)?) }; }
442
443#[cfg(feature = "macros")] #[macro_export]
446macro_rules! d18s0 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d18!($v, scale 0 $(, $($rest)*)?) }; }
447#[cfg(feature = "macros")] #[macro_export]
449macro_rules! d18s2 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d18!($v, scale 2 $(, $($rest)*)?) }; }
450#[cfg(feature = "macros")] #[macro_export]
452macro_rules! d18s4 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d18!($v, scale 4 $(, $($rest)*)?) }; }
453#[cfg(feature = "macros")] #[macro_export]
455macro_rules! d18s6 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d18!($v, scale 6 $(, $($rest)*)?) }; }
456#[cfg(feature = "macros")] #[macro_export]
458macro_rules! d18s9 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d18!($v, scale 9 $(, $($rest)*)?) }; }
459#[cfg(feature = "macros")] #[macro_export]
461macro_rules! d18s12 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d18!($v, scale 12 $(, $($rest)*)?) }; }
462
463#[cfg(feature = "macros")] #[macro_export]
466macro_rules! d38s0 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d38!($v, scale 0 $(, $($rest)*)?) }; }
467#[cfg(feature = "macros")] #[macro_export]
469macro_rules! d38s2 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d38!($v, scale 2 $(, $($rest)*)?) }; }
470#[cfg(feature = "macros")] #[macro_export]
472macro_rules! d38s4 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d38!($v, scale 4 $(, $($rest)*)?) }; }
473#[cfg(feature = "macros")] #[macro_export]
475macro_rules! d38s6 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d38!($v, scale 6 $(, $($rest)*)?) }; }
476#[cfg(feature = "macros")] #[macro_export]
478macro_rules! d38s8 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d38!($v, scale 8 $(, $($rest)*)?) }; }
479#[cfg(feature = "macros")] #[macro_export]
481macro_rules! d38s9 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d38!($v, scale 9 $(, $($rest)*)?) }; }
482#[cfg(feature = "macros")] #[macro_export]
484macro_rules! d38s12 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d38!($v, scale 12 $(, $($rest)*)?) }; }
485#[cfg(feature = "macros")] #[macro_export]
487macro_rules! d38s15 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d38!($v, scale 15 $(, $($rest)*)?) }; }
488#[cfg(feature = "macros")] #[macro_export]
490macro_rules! d38s18 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d38!($v, scale 18 $(, $($rest)*)?) }; }
491#[cfg(feature = "macros")] #[macro_export]
493macro_rules! d38s24 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d38!($v, scale 24 $(, $($rest)*)?) }; }
494#[cfg(feature = "macros")] #[macro_export]
496macro_rules! d38s35 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d38!($v, scale 35 $(, $($rest)*)?) }; }
497
498#[cfg(all(feature = "macros", any(feature = "d76", feature = "wide")))] #[macro_export]
501macro_rules! d76s0 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d76!($v, scale 0 $(, $($rest)*)?) }; }
502#[cfg(all(feature = "macros", any(feature = "d76", feature = "wide")))] #[macro_export]
504macro_rules! d76s2 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d76!($v, scale 2 $(, $($rest)*)?) }; }
505#[cfg(all(feature = "macros", any(feature = "d76", feature = "wide")))] #[macro_export]
507macro_rules! d76s6 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d76!($v, scale 6 $(, $($rest)*)?) }; }
508#[cfg(all(feature = "macros", any(feature = "d76", feature = "wide")))] #[macro_export]
510macro_rules! d76s12 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d76!($v, scale 12 $(, $($rest)*)?) }; }
511#[cfg(all(feature = "macros", any(feature = "d76", feature = "wide")))] #[macro_export]
513macro_rules! d76s18 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d76!($v, scale 18 $(, $($rest)*)?) }; }
514#[cfg(all(feature = "macros", any(feature = "d76", feature = "wide")))] #[macro_export]
516macro_rules! d76s35 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d76!($v, scale 35 $(, $($rest)*)?) }; }
517#[cfg(all(feature = "macros", any(feature = "d76", feature = "wide")))] #[macro_export]
519macro_rules! d76s50 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d76!($v, scale 50 $(, $($rest)*)?) }; }
520
521#[cfg(all(feature = "macros", any(feature = "d153", feature = "wide")))] #[macro_export]
524macro_rules! d153s0 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d153!($v, scale 0 $(, $($rest)*)?) }; }
525#[cfg(all(feature = "macros", any(feature = "d153", feature = "wide")))] #[macro_export]
527macro_rules! d153s35 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d153!($v, scale 35 $(, $($rest)*)?) }; }
528#[cfg(all(feature = "macros", any(feature = "d153", feature = "wide")))] #[macro_export]
530macro_rules! d153s75 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d153!($v, scale 75 $(, $($rest)*)?) }; }
531#[cfg(all(feature = "macros", any(feature = "d153", feature = "wide")))] #[macro_export]
533macro_rules! d153s150 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d153!($v, scale 150 $(, $($rest)*)?) }; }
534
535#[cfg(all(feature = "macros", any(feature = "d307", feature = "wide", feature = "x-wide")))] #[macro_export]
538macro_rules! d307s0 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d307!($v, scale 0 $(, $($rest)*)?) }; }
539#[cfg(all(feature = "macros", any(feature = "d307", feature = "wide", feature = "x-wide")))] #[macro_export]
541macro_rules! d307s35 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d307!($v, scale 35 $(, $($rest)*)?) }; }
542#[cfg(all(feature = "macros", any(feature = "d307", feature = "wide", feature = "x-wide")))] #[macro_export]
544macro_rules! d307s150 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d307!($v, scale 150 $(, $($rest)*)?) }; }
545#[cfg(all(feature = "macros", any(feature = "d307", feature = "wide", feature = "x-wide")))] #[macro_export]
547macro_rules! d307s300 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d307!($v, scale 300 $(, $($rest)*)?) }; }