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