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;
255
256
257pub use consts::DecimalConsts;
258pub use decimal_trait::Decimal;
259pub use error::{ConvertError, ParseError};
260pub use rounding::RoundingMode;
261
262pub use core_type::{
264 D38, D38s0, D38s1, D38s2, D38s3, D38s4, D38s5, D38s6, D38s7, D38s8, D38s9, D38s10,
265 D38s11, D38s12, D38s13, D38s14, D38s15, D38s16, D38s17, D38s18, D38s19, D38s20,
266 D38s21, D38s22, D38s23, D38s24, D38s25, D38s26, D38s27, D38s28, D38s29, D38s30,
267 D38s31, D38s32, D38s33, D38s34, D38s35, D38s36, D38s37, D38s38,
268};
269
270pub use core_type::{
272 D9, D9s0, D9s1, D9s2, D9s3, D9s4, D9s5, D9s6, D9s7, D9s8, D9s9,
273};
274
275pub use core_type::{
277 D18, D18s0, D18s1, D18s2, D18s3, D18s4, D18s5, D18s6, D18s7, D18s8, D18s9, D18s10, D18s11,
278 D18s12, D18s13, D18s14, D18s15, D18s16, D18s17, D18s18,
279};
280
281#[cfg(any(feature = "d76", feature = "wide"))]
283pub use core_type::{
284 D76,
285 D76s0, D76s1, D76s2, D76s3, D76s4, D76s6, D76s9, D76s12, D76s15,
286 D76s18, D76s20, D76s24, D76s28, D76s32, D76s35, D76s38, D76s42,
287 D76s48, D76s50, D76s56, D76s64, D76s70, D76s75, D76s76,
288};
289
290#[cfg(any(feature = "d76", feature = "d153", feature = "d307", feature = "wide"))]
293pub use wide_int::{
294 Int256, Int512, Int1024, Int2048, Int4096, Uint256, Uint512, Uint1024, Uint2048, Uint4096,
295};
296
297#[cfg(any(feature = "d153", feature = "wide"))]
299pub use core_type::{
300 D153,
301 D153s0, D153s1, D153s2, D153s4, D153s6, D153s9, D153s12, D153s15,
302 D153s18, D153s20, D153s24, D153s28, D153s32, D153s35, D153s38,
303 D153s50, D153s57, D153s75, D153s76, D153s100, D153s115, D153s140,
304 D153s150, D153s152, D153s153,
305};
306
307#[cfg(any(feature = "d307", feature = "wide"))]
309pub use core_type::{
310 D307,
311 D307s0, D307s1, D307s2, D307s4, D307s6, D307s9, D307s12, D307s15,
312 D307s18, D307s20, D307s24, D307s28, D307s32, D307s35, D307s38,
313 D307s50, D307s75, D307s100, D307s115, D307s150, D307s153,
314 D307s200, D307s230, D307s275, D307s300, D307s306, D307s307,
315};
316
317#[cfg(any(feature = "d56", feature = "wide"))]
321pub use core_type::{
322 D56,
323 D56s0, D56s1, D56s2, D56s4, D56s6, D56s9, D56s12, D56s18, D56s20, D56s24,
324 D56s28, D56s32, D56s38, D56s42, D56s48, D56s52, D56s56, D56s57,
325};
326#[cfg(any(feature = "d56", feature = "wide"))]
327pub use wide_int::{Int192, Uint192};
328
329#[cfg(any(feature = "d114", feature = "wide"))]
331pub use core_type::{
332 D114,
333 D114s0, D114s1, D114s4, D114s8, D114s16, D114s24, D114s32, D114s38, D114s50,
334 D114s57, D114s64, D114s76, D114s90, D114s100, D114s110, D114s114, D114s115,
335};
336#[cfg(any(feature = "d114", feature = "wide"))]
337pub use wide_int::{Int384, Uint384};
338
339#[cfg(any(feature = "d230", feature = "wide"))]
341pub use core_type::{
342 D230,
343 D230s0, D230s1, D230s6, D230s18, D230s38, D230s57, D230s75, D230s100, D230s115,
344 D230s140, D230s153, D230s175, D230s200, D230s215, D230s225, D230s229, D230s230,
345};
346#[cfg(any(feature = "d230", feature = "wide"))]
347pub use wide_int::{Int768, Uint768};
348
349#[cfg(any(feature = "d461", feature = "x-wide"))]
351pub use core_type::{
352 D461,
353 D461s0, D461s1, D461s18, D461s38, D461s75, D461s115, D461s153, D461s200, D461s230,
354 D461s275, D461s307, D461s350, D461s400, D461s440, D461s460, D461s461, D461s462,
355};
356#[cfg(any(feature = "d461", feature = "x-wide"))]
357pub use wide_int::{Int1536, Uint1536};
358
359#[cfg(any(feature = "d615", feature = "x-wide"))]
363pub use core_type::{
364 D615,
365 D615s0, D615s1, D615s38, D615s75, D615s115, D615s153, D615s200, D615s230, D615s275,
366 D615s308, D615s380, D615s462, D615s500, D615s555, D615s600, D615s615, D615s616,
367};
368
369#[cfg(any(feature = "d923", feature = "xx-wide"))]
371pub use core_type::{
372 D923,
373 D923s0, D923s1, D923s75, D923s153, D923s230, D923s307, D923s400, D923s461, D923s462,
374 D923s500, D923s616, D923s700, D923s800, D923s860, D923s900, D923s920, D923s923, D923s924,
375};
376#[cfg(any(feature = "d923", feature = "xx-wide"))]
377pub use wide_int::{Int3072, Int6144, Int12288, Uint3072, Uint6144, Uint12288};
378
379#[cfg(any(feature = "d1231", feature = "xx-wide"))]
381pub use core_type::{
382 D1231,
383 D1231s0, D1231s1, D1231s75, D1231s153, D1231s230, D1231s307, D1231s461, D1231s616,
384 D1231s700, D1231s800, D1231s900, D1231s924, D1231s1000, D1231s1100,
385 D1231s1180, D1231s1220, D1231s1230, D1231s1231, D1231s1232,
386};
387#[cfg(any(feature = "d1231", feature = "xx-wide"))]
388pub use wide_int::{Int8192, Int16384, Uint8192, Uint16384};
389
390#[cfg(feature = "macros")]
396pub use decimal_scaled_macros::{d9, d18, d38};
397
398#[cfg(all(feature = "macros", any(feature = "d76", feature = "wide")))]
399pub use decimal_scaled_macros::d76;
400
401#[cfg(all(feature = "macros", any(feature = "d153", feature = "wide")))]
402pub use decimal_scaled_macros::d153;
403
404#[cfg(all(feature = "macros", any(feature = "d307", feature = "wide", feature = "x-wide")))]
405pub use decimal_scaled_macros::d307;
406
407#[cfg(all(feature = "macros", any(feature = "d56", feature = "wide")))]
408pub use decimal_scaled_macros::d56;
409
410#[cfg(all(feature = "macros", any(feature = "d114", feature = "wide")))]
411pub use decimal_scaled_macros::d114;
412
413#[cfg(all(feature = "macros", any(feature = "d230", feature = "wide")))]
414pub use decimal_scaled_macros::d230;
415
416#[cfg(all(feature = "macros", any(feature = "d461", feature = "x-wide")))]
417pub use decimal_scaled_macros::d461;
418
419#[cfg(all(feature = "macros", any(feature = "d615", feature = "x-wide")))]
420pub use decimal_scaled_macros::d615;
421
422#[cfg(all(feature = "macros", any(feature = "d923", feature = "xx-wide")))]
423pub use decimal_scaled_macros::d923;
424
425#[cfg(all(feature = "macros", any(feature = "d1231", feature = "xx-wide")))]
426pub use decimal_scaled_macros::d1231;
427
428#[cfg(feature = "macros")] #[macro_export]
442macro_rules! d9s0 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d9!($v, scale 0 $(, $($rest)*)?) }; }
443#[cfg(feature = "macros")] #[macro_export]
445macro_rules! d9s2 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d9!($v, scale 2 $(, $($rest)*)?) }; }
446#[cfg(feature = "macros")] #[macro_export]
448macro_rules! d9s4 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d9!($v, scale 4 $(, $($rest)*)?) }; }
449#[cfg(feature = "macros")] #[macro_export]
451macro_rules! d9s6 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d9!($v, scale 6 $(, $($rest)*)?) }; }
452#[cfg(feature = "macros")] #[macro_export]
454macro_rules! d9s9 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d9!($v, scale 9 $(, $($rest)*)?) }; }
455
456#[cfg(feature = "macros")] #[macro_export]
459macro_rules! d18s0 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d18!($v, scale 0 $(, $($rest)*)?) }; }
460#[cfg(feature = "macros")] #[macro_export]
462macro_rules! d18s2 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d18!($v, scale 2 $(, $($rest)*)?) }; }
463#[cfg(feature = "macros")] #[macro_export]
465macro_rules! d18s4 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d18!($v, scale 4 $(, $($rest)*)?) }; }
466#[cfg(feature = "macros")] #[macro_export]
468macro_rules! d18s6 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d18!($v, scale 6 $(, $($rest)*)?) }; }
469#[cfg(feature = "macros")] #[macro_export]
471macro_rules! d18s9 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d18!($v, scale 9 $(, $($rest)*)?) }; }
472#[cfg(feature = "macros")] #[macro_export]
474macro_rules! d18s12 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d18!($v, scale 12 $(, $($rest)*)?) }; }
475#[cfg(feature = "macros")] #[macro_export]
477macro_rules! d18s18 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d18!($v, scale 18 $(, $($rest)*)?) }; }
478
479#[cfg(feature = "macros")] #[macro_export]
482macro_rules! d38s0 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d38!($v, scale 0 $(, $($rest)*)?) }; }
483#[cfg(feature = "macros")] #[macro_export]
485macro_rules! d38s2 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d38!($v, scale 2 $(, $($rest)*)?) }; }
486#[cfg(feature = "macros")] #[macro_export]
488macro_rules! d38s4 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d38!($v, scale 4 $(, $($rest)*)?) }; }
489#[cfg(feature = "macros")] #[macro_export]
491macro_rules! d38s6 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d38!($v, scale 6 $(, $($rest)*)?) }; }
492#[cfg(feature = "macros")] #[macro_export]
494macro_rules! d38s8 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d38!($v, scale 8 $(, $($rest)*)?) }; }
495#[cfg(feature = "macros")] #[macro_export]
497macro_rules! d38s9 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d38!($v, scale 9 $(, $($rest)*)?) }; }
498#[cfg(feature = "macros")] #[macro_export]
500macro_rules! d38s12 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d38!($v, scale 12 $(, $($rest)*)?) }; }
501#[cfg(feature = "macros")] #[macro_export]
503macro_rules! d38s15 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d38!($v, scale 15 $(, $($rest)*)?) }; }
504#[cfg(feature = "macros")] #[macro_export]
506macro_rules! d38s18 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d38!($v, scale 18 $(, $($rest)*)?) }; }
507#[cfg(feature = "macros")] #[macro_export]
509macro_rules! d38s24 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d38!($v, scale 24 $(, $($rest)*)?) }; }
510#[cfg(feature = "macros")] #[macro_export]
512macro_rules! d38s35 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d38!($v, scale 35 $(, $($rest)*)?) }; }
513#[cfg(feature = "macros")] #[macro_export]
515macro_rules! d38s38 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d38!($v, scale 38 $(, $($rest)*)?) }; }
516
517#[cfg(all(feature = "macros", any(feature = "d76", feature = "wide")))] #[macro_export]
520macro_rules! d76s0 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d76!($v, scale 0 $(, $($rest)*)?) }; }
521#[cfg(all(feature = "macros", any(feature = "d76", feature = "wide")))] #[macro_export]
523macro_rules! d76s2 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d76!($v, scale 2 $(, $($rest)*)?) }; }
524#[cfg(all(feature = "macros", any(feature = "d76", feature = "wide")))] #[macro_export]
526macro_rules! d76s6 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d76!($v, scale 6 $(, $($rest)*)?) }; }
527#[cfg(all(feature = "macros", any(feature = "d76", feature = "wide")))] #[macro_export]
529macro_rules! d76s12 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d76!($v, scale 12 $(, $($rest)*)?) }; }
530#[cfg(all(feature = "macros", any(feature = "d76", feature = "wide")))] #[macro_export]
532macro_rules! d76s18 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d76!($v, scale 18 $(, $($rest)*)?) }; }
533#[cfg(all(feature = "macros", any(feature = "d76", feature = "wide")))] #[macro_export]
535macro_rules! d76s35 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d76!($v, scale 35 $(, $($rest)*)?) }; }
536#[cfg(all(feature = "macros", any(feature = "d76", feature = "wide")))] #[macro_export]
538macro_rules! d76s50 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d76!($v, scale 50 $(, $($rest)*)?) }; }
539#[cfg(all(feature = "macros", any(feature = "d76", feature = "wide")))] #[macro_export]
541macro_rules! d76s76 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d76!($v, scale 76 $(, $($rest)*)?) }; }
542
543#[cfg(all(feature = "macros", any(feature = "d153", feature = "wide")))] #[macro_export]
546macro_rules! d153s0 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d153!($v, scale 0 $(, $($rest)*)?) }; }
547#[cfg(all(feature = "macros", any(feature = "d153", feature = "wide")))] #[macro_export]
549macro_rules! d153s35 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d153!($v, scale 35 $(, $($rest)*)?) }; }
550#[cfg(all(feature = "macros", any(feature = "d153", feature = "wide")))] #[macro_export]
552macro_rules! d153s75 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d153!($v, scale 75 $(, $($rest)*)?) }; }
553#[cfg(all(feature = "macros", any(feature = "d153", feature = "wide")))] #[macro_export]
555macro_rules! d153s150 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d153!($v, scale 150 $(, $($rest)*)?) }; }
556#[cfg(all(feature = "macros", any(feature = "d153", feature = "wide")))] #[macro_export]
558macro_rules! d153s153 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d153!($v, scale 153 $(, $($rest)*)?) }; }
559
560#[cfg(all(feature = "macros", any(feature = "d307", feature = "wide", feature = "x-wide")))] #[macro_export]
563macro_rules! d307s0 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d307!($v, scale 0 $(, $($rest)*)?) }; }
564#[cfg(all(feature = "macros", any(feature = "d307", feature = "wide", feature = "x-wide")))] #[macro_export]
566macro_rules! d307s35 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d307!($v, scale 35 $(, $($rest)*)?) }; }
567#[cfg(all(feature = "macros", any(feature = "d307", feature = "wide", feature = "x-wide")))] #[macro_export]
569macro_rules! d307s150 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d307!($v, scale 150 $(, $($rest)*)?) }; }
570#[cfg(all(feature = "macros", any(feature = "d307", feature = "wide", feature = "x-wide")))] #[macro_export]
572macro_rules! d307s300 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d307!($v, scale 300 $(, $($rest)*)?) }; }
573#[cfg(all(feature = "macros", any(feature = "d307", feature = "wide", feature = "x-wide")))] #[macro_export]
575macro_rules! d307s307 { ($v:tt $(, $($rest:tt)*)?) => { $crate::d307!($v, scale 307 $(, $($rest)*)?) }; }