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 arithmetic;
188#[cfg(feature = "bench-alt")]
189mod bench_alt;
190#[cfg(feature = "bench-alt")]
191#[doc(hidden)]
192pub mod __bench_internals {
193 #[inline(never)]
194 pub fn limbs_mul(a: &[u128], b: &[u128], out: &mut [u128]) {
195 crate::wide_int::limbs_mul(a, b, out)
196 }
197 #[inline(never)]
198 pub fn limbs_mul_fast(a: &[u128], b: &[u128], out: &mut [u128]) {
199 crate::wide_int::limbs_mul_fast(a, b, out)
200 }
201 #[inline(never)]
202 pub fn mul_slice(a: &[u64], b: &[u64], out: &mut [u64]) {
203 crate::wide_int::limbs_mul_u64(a, b, out)
204 }
205 #[inline(never)]
206 pub fn mul_fixed<const L: usize, const D: usize>(
207 a: &[u64; L],
208 b: &[u64; L],
209 out: &mut [u64; D],
210 ) {
211 crate::wide_int::limbs_mul_u64_fixed::<L, D>(a, b, out)
212 }
213}
214mod consts;
215mod consts_wide;
216mod core_type;
217mod decimal_trait;
218mod display;
219mod equalities;
220mod error;
221mod macros;
222mod num_traits;
223mod log_exp_strict;
224mod log_exp_fast;
225
226mod rescale;
232mod rounding;
233mod mg_divide;
234mod d_w128_kernels;
235mod wide_int;
243mod overflow_variants;
244mod powers_strict;
245mod powers_fast;
246
247#[cfg(feature = "serde")]
248pub mod serde_helpers;
249#[cfg(any(not(feature = "fast"), feature = "std"))]
253mod trig_strict;
254mod trig_fast;
255mod transcendental_trait;
256mod arithmetic_trait;
257mod convert_trait;
258
259
260pub use consts::DecimalConstants;
261#[allow(deprecated)]
262pub use consts::DecimalConsts;
263pub use arithmetic_trait::DecimalArithmetic;
264pub use convert_trait::DecimalConvert;
265pub use decimal_trait::Decimal;
266pub use error::{ConvertError, ParseError};
267pub use rounding::RoundingMode;
268pub use transcendental_trait::DecimalTranscendental;
269
270pub use core_type::{
272 D38, D38s0, D38s1, D38s2, D38s3, D38s4, D38s5, D38s6, D38s7, D38s8, D38s9, D38s10,
273 D38s11, D38s12, D38s13, D38s14, D38s15, D38s16, D38s17, D38s18, D38s19, D38s20,
274 D38s21, D38s22, D38s23, D38s24, D38s25, D38s26, D38s27, D38s28, D38s29, D38s30,
275 D38s31, D38s32, D38s33, D38s34, D38s35, D38s36, D38s37, D38s38,
276};
277
278pub use core_type::{
280 D9, D9s0, D9s1, D9s2, D9s3, D9s4, D9s5, D9s6, D9s7, D9s8, D9s9,
281};
282
283pub use core_type::{
285 D18, D18s0, D18s1, D18s2, D18s3, D18s4, D18s5, D18s6, D18s7, D18s8, D18s9, D18s10, D18s11,
286 D18s12, D18s13, D18s14, D18s15, D18s16, D18s17, D18s18,
287};
288
289#[cfg(any(feature = "d76", feature = "wide"))]
291pub use core_type::{
292 D76,
293 D76s0, D76s1, D76s2, D76s3, D76s4, D76s6, D76s9, D76s12, D76s15,
294 D76s18, D76s20, D76s24, D76s28, D76s32, D76s35, D76s38, D76s42,
295 D76s48, D76s50, D76s56, D76s64, D76s70, D76s75, D76s76,
296};
297
298#[cfg(any(feature = "d76", feature = "d153", feature = "d307", feature = "wide"))]
301pub use wide_int::{
302 Int256, Int512, Int1024, Int2048, Int4096, Uint256, Uint512, Uint1024, Uint2048, Uint4096,
303};
304
305#[cfg(any(feature = "d153", feature = "wide"))]
307pub use core_type::{
308 D153,
309 D153s0, D153s1, D153s2, D153s4, D153s6, D153s9, D153s12, D153s15,
310 D153s18, D153s20, D153s24, D153s28, D153s32, D153s35, D153s38,
311 D153s50, D153s57, D153s75, D153s76, D153s100, D153s115, D153s140,
312 D153s150, D153s152, D153s153,
313};
314
315#[cfg(any(feature = "d307", feature = "wide"))]
317pub use core_type::{
318 D307,
319 D307s0, D307s1, D307s2, D307s4, D307s6, D307s9, D307s12, D307s15,
320 D307s18, D307s20, D307s24, D307s28, D307s32, D307s35, D307s38,
321 D307s50, D307s75, D307s100, D307s115, D307s150, D307s153,
322 D307s200, D307s230, D307s275, D307s300, D307s306, D307s307,
323};
324
325#[cfg(any(feature = "d56", feature = "wide"))]
329pub use core_type::{
330 D56,
331 D56s0, D56s1, D56s2, D56s4, D56s6, D56s9, D56s12, D56s18, D56s20, D56s24,
332 D56s28, D56s32, D56s38, D56s42, D56s48, D56s52, D56s56, D56s57,
333};
334#[cfg(any(feature = "d56", feature = "wide"))]
335pub use wide_int::{Int192, Uint192};
336
337#[cfg(any(feature = "d114", feature = "wide"))]
339pub use core_type::{
340 D114,
341 D114s0, D114s1, D114s4, D114s8, D114s16, D114s24, D114s32, D114s38, D114s50,
342 D114s57, D114s64, D114s76, D114s90, D114s100, D114s110, D114s114, D114s115,
343};
344#[cfg(any(feature = "d114", feature = "wide"))]
345pub use wide_int::{Int384, Uint384};
346
347#[cfg(any(feature = "d230", feature = "wide"))]
349pub use core_type::{
350 D230,
351 D230s0, D230s1, D230s6, D230s18, D230s38, D230s57, D230s75, D230s100, D230s115,
352 D230s140, D230s153, D230s175, D230s200, D230s215, D230s225, D230s229, D230s230,
353};
354#[cfg(any(feature = "d230", feature = "wide"))]
355pub use wide_int::{Int768, Uint768};
356
357#[cfg(any(feature = "d461", feature = "x-wide"))]
359pub use core_type::{
360 D461,
361 D461s0, D461s1, D461s18, D461s38, D461s75, D461s115, D461s153, D461s200, D461s230,
362 D461s275, D461s307, D461s350, D461s400, D461s440, D461s460, D461s461, D461s462,
363};
364#[cfg(any(feature = "d461", feature = "x-wide"))]
365pub use wide_int::{Int1536, Uint1536};
366
367#[cfg(any(feature = "d615", feature = "x-wide"))]
371pub use core_type::{
372 D615,
373 D615s0, D615s1, D615s38, D615s75, D615s115, D615s153, D615s200, D615s230, D615s275,
374 D615s308, D615s380, D615s462, D615s500, D615s555, D615s600, D615s615, D615s616,
375};
376
377#[cfg(any(feature = "d923", feature = "xx-wide"))]
379pub use core_type::{
380 D923,
381 D923s0, D923s1, D923s75, D923s153, D923s230, D923s307, D923s400, D923s461, D923s462,
382 D923s500, D923s616, D923s700, D923s800, D923s860, D923s900, D923s920, D923s923, D923s924,
383};
384#[cfg(any(feature = "d923", feature = "xx-wide"))]
385pub use wide_int::{Int3072, Int6144, Int12288, Uint3072, Uint6144, Uint12288};
386
387#[cfg(any(feature = "d1231", feature = "xx-wide"))]
389pub use core_type::{
390 D1231,
391 D1231s0, D1231s1, D1231s75, D1231s153, D1231s230, D1231s307, D1231s461, D1231s616,
392 D1231s700, D1231s800, D1231s900, D1231s924, D1231s1000, D1231s1100,
393 D1231s1180, D1231s1220, D1231s1230, D1231s1231, D1231s1232,
394};
395#[cfg(any(feature = "d1231", feature = "xx-wide"))]
396pub use wide_int::{Int8192, Int16384, Uint8192, Uint16384};
397
398#[cfg(feature = "macros")]
404pub use decimal_scaled_macros::{d9, d18, d38};
405
406#[cfg(all(feature = "macros", any(feature = "d76", feature = "wide")))]
407pub use decimal_scaled_macros::d76;
408
409#[cfg(all(feature = "macros", any(feature = "d153", feature = "wide")))]
410pub use decimal_scaled_macros::d153;
411
412#[cfg(all(feature = "macros", any(feature = "d307", feature = "wide", feature = "x-wide")))]
413pub use decimal_scaled_macros::d307;
414
415#[cfg(all(feature = "macros", any(feature = "d56", feature = "wide")))]
416pub use decimal_scaled_macros::d56;
417
418#[cfg(all(feature = "macros", any(feature = "d114", feature = "wide")))]
419pub use decimal_scaled_macros::d114;
420
421#[cfg(all(feature = "macros", any(feature = "d230", feature = "wide")))]
422pub use decimal_scaled_macros::d230;
423
424#[cfg(all(feature = "macros", any(feature = "d461", feature = "x-wide")))]
425pub use decimal_scaled_macros::d461;
426
427#[cfg(all(feature = "macros", any(feature = "d615", feature = "x-wide")))]
428pub use decimal_scaled_macros::d615;
429
430#[cfg(all(feature = "macros", any(feature = "d923", feature = "xx-wide")))]
431pub use decimal_scaled_macros::d923;
432
433#[cfg(all(feature = "macros", any(feature = "d1231", feature = "xx-wide")))]
434pub use decimal_scaled_macros::d1231;
435
436#[cfg(feature = "macros")] #[macro_export]
450macro_rules! d9s0 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d9!($v, scale 0 $(, $($rest)*)?) }; }
451#[cfg(feature = "macros")] #[macro_export]
453macro_rules! d9s2 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d9!($v, scale 2 $(, $($rest)*)?) }; }
454#[cfg(feature = "macros")] #[macro_export]
456macro_rules! d9s4 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d9!($v, scale 4 $(, $($rest)*)?) }; }
457#[cfg(feature = "macros")] #[macro_export]
459macro_rules! d9s6 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d9!($v, scale 6 $(, $($rest)*)?) }; }
460#[cfg(feature = "macros")] #[macro_export]
462macro_rules! d9s9 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d9!($v, scale 9 $(, $($rest)*)?) }; }
463
464#[cfg(feature = "macros")] #[macro_export]
467macro_rules! d18s0 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d18!($v, scale 0 $(, $($rest)*)?) }; }
468#[cfg(feature = "macros")] #[macro_export]
470macro_rules! d18s2 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d18!($v, scale 2 $(, $($rest)*)?) }; }
471#[cfg(feature = "macros")] #[macro_export]
473macro_rules! d18s4 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d18!($v, scale 4 $(, $($rest)*)?) }; }
474#[cfg(feature = "macros")] #[macro_export]
476macro_rules! d18s6 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d18!($v, scale 6 $(, $($rest)*)?) }; }
477#[cfg(feature = "macros")] #[macro_export]
479macro_rules! d18s9 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d18!($v, scale 9 $(, $($rest)*)?) }; }
480#[cfg(feature = "macros")] #[macro_export]
482macro_rules! d18s12 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d18!($v, scale 12 $(, $($rest)*)?) }; }
483#[cfg(feature = "macros")] #[macro_export]
485macro_rules! d18s18 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d18!($v, scale 18 $(, $($rest)*)?) }; }
486
487#[cfg(feature = "macros")] #[macro_export]
490macro_rules! d38s0 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d38!($v, scale 0 $(, $($rest)*)?) }; }
491#[cfg(feature = "macros")] #[macro_export]
493macro_rules! d38s2 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d38!($v, scale 2 $(, $($rest)*)?) }; }
494#[cfg(feature = "macros")] #[macro_export]
496macro_rules! d38s4 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d38!($v, scale 4 $(, $($rest)*)?) }; }
497#[cfg(feature = "macros")] #[macro_export]
499macro_rules! d38s6 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d38!($v, scale 6 $(, $($rest)*)?) }; }
500#[cfg(feature = "macros")] #[macro_export]
502macro_rules! d38s8 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d38!($v, scale 8 $(, $($rest)*)?) }; }
503#[cfg(feature = "macros")] #[macro_export]
505macro_rules! d38s9 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d38!($v, scale 9 $(, $($rest)*)?) }; }
506#[cfg(feature = "macros")] #[macro_export]
508macro_rules! d38s12 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d38!($v, scale 12 $(, $($rest)*)?) }; }
509#[cfg(feature = "macros")] #[macro_export]
511macro_rules! d38s15 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d38!($v, scale 15 $(, $($rest)*)?) }; }
512#[cfg(feature = "macros")] #[macro_export]
514macro_rules! d38s18 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d38!($v, scale 18 $(, $($rest)*)?) }; }
515#[cfg(feature = "macros")] #[macro_export]
517macro_rules! d38s24 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d38!($v, scale 24 $(, $($rest)*)?) }; }
518#[cfg(feature = "macros")] #[macro_export]
520macro_rules! d38s35 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d38!($v, scale 35 $(, $($rest)*)?) }; }
521#[cfg(feature = "macros")] #[macro_export]
523macro_rules! d38s38 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d38!($v, scale 38 $(, $($rest)*)?) }; }
524
525#[cfg(all(feature = "macros", any(feature = "d76", feature = "wide")))] #[macro_export]
528macro_rules! d76s0 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d76!($v, scale 0 $(, $($rest)*)?) }; }
529#[cfg(all(feature = "macros", any(feature = "d76", feature = "wide")))] #[macro_export]
531macro_rules! d76s2 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d76!($v, scale 2 $(, $($rest)*)?) }; }
532#[cfg(all(feature = "macros", any(feature = "d76", feature = "wide")))] #[macro_export]
534macro_rules! d76s6 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d76!($v, scale 6 $(, $($rest)*)?) }; }
535#[cfg(all(feature = "macros", any(feature = "d76", feature = "wide")))] #[macro_export]
537macro_rules! d76s12 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d76!($v, scale 12 $(, $($rest)*)?) }; }
538#[cfg(all(feature = "macros", any(feature = "d76", feature = "wide")))] #[macro_export]
540macro_rules! d76s18 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d76!($v, scale 18 $(, $($rest)*)?) }; }
541#[cfg(all(feature = "macros", any(feature = "d76", feature = "wide")))] #[macro_export]
543macro_rules! d76s35 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d76!($v, scale 35 $(, $($rest)*)?) }; }
544#[cfg(all(feature = "macros", any(feature = "d76", feature = "wide")))] #[macro_export]
546macro_rules! d76s50 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d76!($v, scale 50 $(, $($rest)*)?) }; }
547#[cfg(all(feature = "macros", any(feature = "d76", feature = "wide")))] #[macro_export]
549macro_rules! d76s76 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d76!($v, scale 76 $(, $($rest)*)?) }; }
550
551#[cfg(all(feature = "macros", any(feature = "d153", feature = "wide")))] #[macro_export]
554macro_rules! d153s0 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d153!($v, scale 0 $(, $($rest)*)?) }; }
555#[cfg(all(feature = "macros", any(feature = "d153", feature = "wide")))] #[macro_export]
557macro_rules! d153s35 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d153!($v, scale 35 $(, $($rest)*)?) }; }
558#[cfg(all(feature = "macros", any(feature = "d153", feature = "wide")))] #[macro_export]
560macro_rules! d153s75 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d153!($v, scale 75 $(, $($rest)*)?) }; }
561#[cfg(all(feature = "macros", any(feature = "d153", feature = "wide")))] #[macro_export]
563macro_rules! d153s150 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d153!($v, scale 150 $(, $($rest)*)?) }; }
564#[cfg(all(feature = "macros", any(feature = "d153", feature = "wide")))] #[macro_export]
566macro_rules! d153s153 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d153!($v, scale 153 $(, $($rest)*)?) }; }
567
568#[cfg(all(feature = "macros", any(feature = "d307", feature = "wide", feature = "x-wide")))] #[macro_export]
571macro_rules! d307s0 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d307!($v, scale 0 $(, $($rest)*)?) }; }
572#[cfg(all(feature = "macros", any(feature = "d307", feature = "wide", feature = "x-wide")))] #[macro_export]
574macro_rules! d307s35 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d307!($v, scale 35 $(, $($rest)*)?) }; }
575#[cfg(all(feature = "macros", any(feature = "d307", feature = "wide", feature = "x-wide")))] #[macro_export]
577macro_rules! d307s150 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d307!($v, scale 150 $(, $($rest)*)?) }; }
578#[cfg(all(feature = "macros", any(feature = "d307", feature = "wide", feature = "x-wide")))] #[macro_export]
580macro_rules! d307s300 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d307!($v, scale 300 $(, $($rest)*)?) }; }
581#[cfg(all(feature = "macros", any(feature = "d307", feature = "wide", feature = "x-wide")))] #[macro_export]
583macro_rules! d307s307 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d307!($v, scale 307 $(, $($rest)*)?) }; }