fastnum 0.7.5

Fast decimal numbers library
Documentation
macro_rules! test_impl {
    (D, $bits: literal) => {
        paste::paste! { test_impl!(SIGNED: $bits, [< dec $bits >], [<D $bits>]); }
    };
    (UD, $bits: literal) => {
        paste::paste! { test_impl!(UNSIGNED: $bits, [< udec $bits >], [<UD $bits>]); }
    };
    (UNSIGNED: $bits: tt, $dec: ident, $D: ident) => {
        mod $dec {
            use rstest::*;
            use fastnum::*;

            super::test_impl!(COMMON:: $bits, $dec, $D, THIS);
            super::test_impl!(UNSIGNED:: $bits, $dec, $D, THIS);
        }
    };
    (SIGNED: $bits: tt, $dec: ident, $D: ident) => {
        mod $dec {
            use rstest::*;
            use fastnum::*;

            super::test_impl!(COMMON:: $bits, $dec, $D, THIS);
            super::test_impl!(SIGNED:: $bits, $dec, $D, THIS);
        }
    };
    (COMMON:: 512, $dec: ident, $D: ident, THIS) => {
        super::test_impl!(COMMON:: 256, $dec, $D);
    };
    (UNSIGNED:: 512, $dec: ident, $D: ident, THIS) => {
        super::test_impl!(UNSIGNED:: 256, $dec, $D);
    };
    (SIGNED:: 512, $dec: ident, $D: ident, THIS) => {
        super::test_impl!(SIGNED:: 256, $dec, $D);
    };


    (COMMON:: 256, $dec: ident, $D: ident, THIS) => {
        super::test_impl!(COMMON:: 256, $dec, $D);

        #[rstest(::trace)]
        #[case($dec!(3), $dec!(0.33333333333333333333333333333333333333333333333333333333333333333333333333333))]
        #[case($dec!(66100475480188776883681620311725717740e40), $dec!(1.5128484216421616758615143136440161153055698870539051891810131466128423029423e-78))]
        fn test_recip_256(#[case] d: $D, #[case] expected: $D) {
            let res = d.recip();

            assert_eq!(res, expected);
            assert_eq!(res.op_signals(), signals![!CP, !INEXACT, !ROUND]);
        }
    };
    (COMMON:: 256, $dec: ident, $D: ident) => {
        super::test_impl!(COMMON:: 128, $dec, $D);
    };
    (UNSIGNED:: 256, $dec: ident, $D: ident, THIS) => {
        super::test_impl!(UNSIGNED:: 256, $dec, $D);
    };
    (UNSIGNED:: 256, $dec: ident, $D: ident) => {
        super::test_impl!(UNSIGNED:: 128, $dec, $D);
    };
    (SIGNED:: 256, $dec: ident, $D: ident, THIS) => {
        super::test_impl!(SIGNED:: 256, $dec, $D);
    };
    (SIGNED:: 256, $dec: ident, $D: ident) => {
        super::test_impl!(SIGNED:: 128, $dec, $D);
    };

    (COMMON:: 128, $dec: ident, $D: ident, THIS) => {
        super::test_impl!(COMMON:: 128, $dec, $D);

        #[rstest(::trace)]
        #[case($dec!(3), $dec!(0.333333333333333333333333333333333333333))]
        #[case($dec!(66100475480188776883681620311725717740e40), $dec!(1.51284842164216167586151431364401611531e-78))]
        fn test_recip_128(#[case] d: $D, #[case] expected: $D) {
            let res = d.recip();

            assert_eq!(res, expected);
            assert_eq!(res.op_signals(), signals![!CP, !INEXACT, !ROUND]);
        }
    };
    (COMMON:: 128, $dec: ident, $D: ident) => {
        super::test_impl!(COMMON:: 64, $dec, $D);
    };
    (UNSIGNED:: 128, $dec: ident, $D: ident, THIS) => {
        super::test_impl!(UNSIGNED:: 128, $dec, $D);
    };
    (UNSIGNED:: 128, $dec: ident, $D: ident) => {
        super::test_impl!(UNSIGNED:: 64, $dec, $D);
    };
    (SIGNED:: 128, $dec: ident, $D: ident, THIS) => {
        super::test_impl!(SIGNED:: 128, $dec, $D);
    };
    (SIGNED:: 128, $dec: ident, $D: ident) => {
        super::test_impl!(SIGNED:: 64, $dec, $D);
    };

    (COMMON:: 64, $dec: ident, $D: ident, THIS) => {
        super::test_impl!(COMMON:: 64, $dec, $D);

        #[rstest(::trace)]
        #[case($dec!(3), $dec!(0.3333333333333333333))]
        #[case($dec!(6610047548018877688e40), $dec!(1.5128484216421616759e-59))]
        fn test_recip_64(#[case] d: $D, #[case] expected: $D) {
            let res = d.recip();

            assert_eq!(res, expected);
            assert_eq!(res.op_signals(), signals![!CP, !INEXACT, !ROUND]);
        }

    };
    (COMMON:: 64, $dec: ident, $D: ident) => {
        #[rstest(::trace)]
        #[case($dec!(2), $dec!(0.5))]
        #[case($dec!(2.0), $dec!(0.5))]
        #[case($dec!(2.00), $dec!(0.50))]
        #[case($dec!(2.000), $dec!(0.500))]
        #[case($dec!(2.0000), $dec!(0.5000))]
        #[case($dec!(2.00000), $dec!(0.50000))]
        #[case($dec!(2.000000), $dec!(0.500000))]
        #[case($dec!(2.0000000), $dec!(0.5000000))]
        #[case($dec!(4), $dec!(0.25))]
        #[case($dec!(8), $dec!(0.125))]
        #[case($dec!(16), $dec!(0.0625))]
        #[case($dec!(25), $dec!(0.04))]
        #[case($dec!(32), $dec!(0.03125))]
        #[case($dec!(64), $dec!(0.015625))]
        #[case($dec!(1024), $dec!(0.0009765625))]
        #[case($dec!(2e-2), $dec!(50.00))]
        #[case($dec!(0.2), $dec!(5.0))]
        #[case($dec!(0.02), $dec!(50.00))]
        #[case($dec!(0.020), $dec!(50.000))]
        fn test_recip(#[case] d: $D, #[case] expected: $D) {
            let res = d.recip();

            assert_eq!(res, expected);
            assert_eq!(res.op_signals(), signals![!CP, !INEXACT, !ROUND]);
        }
    };
    (UNSIGNED:: 64, $dec: ident, $D: ident, THIS) => {
        super::test_impl!(UNSIGNED:: 64, $dec, $D);
    };
    (UNSIGNED:: 64, $dec: ident, $D: ident) => {

    };
    (SIGNED:: 64, $dec: ident, $D: ident, THIS) => {
        super::test_impl!(SIGNED:: 64, $dec, $D);
    };
    (SIGNED:: 64, $dec: ident, $D: ident) => {
        #[rstest(::trace)]
        #[case($dec!(-2), $dec!(-0.5))]
        #[case($dec!(-4), $dec!(-0.25))]
        #[case($dec!(-8), $dec!(-0.125))]
        #[case($dec!(-16), $dec!(-0.0625))]
        #[case($dec!(-32), $dec!(-0.03125))]
        #[case($dec!(-64), $dec!(-0.015625))]
        fn test_recip_signed(#[case] d: $D, #[case] expected: $D) {
            let res = d.recip();

            assert_eq!(res, expected);
            assert_eq!(res.op_signals(), signals![!CP, !INEXACT, !ROUND]);
        }
    };
}

pub(crate) use test_impl;