break-eternity 0.2.0

A numerical library to represent numbers as large as 10^^1e308 and as 'small' as 10^-(10^^1e308).
Documentation
use break_eternity::Decimal;

#[test]
fn decimal() {
    assert_eq!(Decimal::from_number(0.0).to_string(), "0");
    assert_eq!(Decimal::from_number(f64::NAN).to_string(), "NaN");
    assert_eq!(Decimal::from_number(f64::INFINITY).to_string(), "Infinity");
    assert_eq!(
        Decimal::from_number(f64::NEG_INFINITY).to_string(),
        "-Infinity"
    );

    assert_eq!(Decimal::from_number(100.0).to_string(), "100");
    assert_eq!(Decimal::from_number(1e12).to_string(), "1000000000000");
    assert_eq!(Decimal::from_number(1.79e3).to_string(), "1790");
    assert_eq!(Decimal::from_number(1e308).to_string(), "1e308");
}

#[test]
fn simple_maths() {
    let a = Decimal::from_number(4.0);
    let b = Decimal::from_number(2.0);

    assert_eq!(a + b, Decimal::from_number(6.0));
    assert_eq!(a - b, Decimal::from_number(2.0));
    assert_eq!(a * b, Decimal::from_number(8.0));
    assert_eq!(a / b, Decimal::from_number(2.0));
}

#[test]
fn ops() {
    let a = Decimal::from_mantissa_exponent_no_normalize(3.224, 54.0);
    let b = Decimal::from_mantissa_exponent_no_normalize(1.24, 53.0);
    let c = Decimal::from_mantissa_exponent_no_normalize(3.1, 52.0);

    assert_eq!(
        a + b,
        Decimal::from_mantissa_exponent_no_normalize(3.348, 54.0)
    );
    assert_eq!(
        a - b,
        Decimal::from_mantissa_exponent_no_normalize(3.1, 54.0)
    );
    assert_eq!(
        a * b,
        Decimal::from_mantissa_exponent_no_normalize(3.9977600000000004, 107.0)
    );
    assert_eq!(
        a / b,
        Decimal::from_mantissa_exponent_no_normalize(2.6, 1.0)
    );

    assert_eq!(
        a + c,
        Decimal::from_mantissa_exponent_no_normalize(3.255, 54.0)
    );
    assert_eq!(
        a - c,
        Decimal::from_mantissa_exponent_no_normalize(3.193, 54.0)
    );
    assert_eq!(
        a * c,
        Decimal::from_mantissa_exponent_no_normalize(9.9944, 106.0)
    );
    assert_eq!(
        a / c,
        Decimal::from_mantissa_exponent_no_normalize(1.04, 2.0)
    );

    assert_eq!(
        b + c,
        Decimal::from_mantissa_exponent_no_normalize(1.55, 53.0)
    );
    assert_eq!(
        b - c,
        Decimal::from_mantissa_exponent_no_normalize(9.3, 52.0)
    );
    assert_eq!(
        b * c,
        Decimal::from_mantissa_exponent_no_normalize(3.844, 105.0)
    );
    assert_eq!(
        b / c,
        Decimal::from_mantissa_exponent_no_normalize(3.9999999999999996, 0.0)
    );
}

#[test]
fn rem() {
    let a = Decimal::from_number(5.0);
    let b = Decimal::from_number(2.0);

    assert_eq!(a % b, Decimal::from_number(1.0));
}

#[test]
#[allow(clippy::bool_assert_comparison)]
fn cmp() {
    let a = Decimal::from_mantissa_exponent_no_normalize(3.224, 54.0);
    let b = Decimal::from_mantissa_exponent_no_normalize(1.24, 53.0);
    let c = Decimal::from_mantissa_exponent_no_normalize(3.1, 52.0);
    let d = Decimal::from_mantissa_exponent_no_normalize(3.224, 54.0);

    assert_eq!(a == b, false);
    assert_eq!(a == d, true);
    assert_eq!(b == d, false);

    assert_eq!(a >= b, true);
    assert_eq!(a >= d, true);
    assert_eq!(b >= d, false);

    assert_eq!(a > b, true);
    assert_eq!(a > d, false);
    assert_eq!(b > d, false);

    assert_eq!(a <= b, false);
    assert_eq!(a <= d, true);
    assert_eq!(b <= d, true);

    assert_eq!(a < b, false);
    assert_eq!(a < d, false);
    assert_eq!(b < d, true);

    assert_eq!(a.max(b), a);
    assert_eq!(a.max(c), a);
    assert_eq!(b.max(c), b);

    assert_eq!(a.min(b), b);
    assert_eq!(a.min(c), c);
    assert_eq!(b.min(c), c);

    assert_eq!(a.clamp(c, b), b);
    assert_eq!(b.clamp(c, a), b);
    assert_eq!(c.clamp(b, b), b);
}

#[test]
fn neg_abs() {
    assert_eq!(
        -Decimal::from_number(456.7),
        Decimal::from_mantissa_exponent_no_normalize(-4.567, 2.0)
    );
    assert_eq!(
        -Decimal::from_number(1.23e48),
        Decimal::from_mantissa_exponent_no_normalize(-1.23, 48.0)
    );

    assert_eq!(
        Decimal::from_number(-456.7).abs(),
        Decimal::from_mantissa_exponent_no_normalize(4.567, 2.0)
    );
    assert_eq!(
        Decimal::from_number(-1.23e48).abs(),
        Decimal::from_mantissa_exponent_no_normalize(1.23, 48.0)
    );
}