// Copyright © 2024 Mikhail Hogrefe
//
// This file is part of Malachite.
//
// Malachite is free software: you can redistribute it and/or modify it under the terms of the GNU
// Lesser General Public License (LGPL) as published by the Free Software Foundation; either version
// 3 of the License, or (at your option) any later version. See .
use malachite_base::num::basic::floats::PrimitiveFloat;
use malachite_base::num::float::NiceFloat;
use malachite_base::num::random::special_random_negative_finite_primitive_floats;
use malachite_base::random::EXAMPLE_SEED;
use malachite_base::test_util::num::random::special_random_primitive_floats_helper_helper;
use malachite_base::test_util::stats::moments::{CheckedToF64, MomentStats};
use std::panic::catch_unwind;
fn special_random_negative_finite_primitive_floats_helper(
mean_exponent_numerator: u64,
mean_exponent_denominator: u64,
mean_precision_numerator: u64,
mean_precision_denominator: u64,
expected_values: &[T],
expected_common_values: &[(T, usize)],
expected_median: (T, Option),
expected_moment_stats: MomentStats,
) {
special_random_primitive_floats_helper_helper(
special_random_negative_finite_primitive_floats::(
EXAMPLE_SEED,
mean_exponent_numerator,
mean_exponent_denominator,
mean_precision_numerator,
mean_precision_denominator,
),
expected_values,
expected_common_values,
expected_median,
expected_moment_stats,
);
}
#[test]
fn test_special_random_negative_finite_primitive_floats() {
// f32, mean abs of exponent = 1/64, mean precision = 65/64
let values = &[
-1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0,
-1.0, -1.0, -1.0, -1.0, -0.5, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0,
-1.0, -1.0, -1.0, -1.0, -0.5, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0,
-1.0, -1.0, -1.0, -1.0, -1.0,
];
let common_values = &[
(-1.0, 954991),
(-1.5, 14672),
(-2.0, 14586),
(-0.5, 14578),
(-3.0, 243),
(-0.25, 228),
(-4.0, 226),
(-0.75, 207),
(-1.25, 127),
(-1.75, 118),
(-6.0, 6),
(-0.125, 4),
(-2.5, 3),
(-8.0, 3),
(-0.625, 3),
(-0.375, 2),
(-0.875, 2),
(-3.5, 1),
];
let sample_median = (-1.0, None);
let sample_moment_stats = MomentStats {
mean: NiceFloat(-1.0157463749999305),
standard_deviation: NiceFloat(0.15870215416222863),
skewness: NiceFloat(-5.805128395366302),
excess_kurtosis: NiceFloat(73.03005686221248),
};
special_random_negative_finite_primitive_floats_helper::(
1,
64,
65,
64,
values,
common_values,
sample_median,
sample_moment_stats,
);
// f32, mean abs of exponent = 1, mean precision = 2
let values = &[
-1.0, -1.5, -3.125, -1.0, -1.0, -2.0, -2.0, -1.0, -3.0, -1.0, -2.0, -3.0, -4.0, -1.5,
-1.625, -2.0, -0.125, -1.0, -0.375, -1.5, -6.375, -4.0, -6.875, -0.5, -0.234375, -1.0,
-0.2421875, -6.0, -0.75, -6.0, -6.0, -2.0, -0.21875, -2.0, -0.875, -0.875, -6.0, -16.0,
-27.0, -2.25, -1.5, -1.5, -8.75, -4.0, -0.25, -1.5, -0.375, -0.375, -1.0, -0.09375,
];
let common_values = &[
(-1.0, 166355),
(-2.0, 83686),
(-0.5, 83270),
(-1.5, 82925),
(-3.0, 41733),
(-0.75, 41659),
(-4.0, 41550),
(-0.25, 41388),
(-1.75, 21006),
(-6.0, 20858),
(-0.125, 20779),
(-8.0, 20769),
(-0.375, 20764),
(-1.25, 20753),
(-12.0, 10512),
(-2.5, 10508),
(-0.0625, 10447),
(-0.625, 10414),
(-0.1875, 10394),
(-16.0, 10354),
];
let sample_median = (-1.03125, None);
let sample_moment_stats = MomentStats {
mean: NiceFloat(-7.654060290573151),
standard_deviation: NiceFloat(374.2183970257817),
skewness: NiceFloat(-257.0774178486101),
excess_kurtosis: NiceFloat(79059.24924350459),
};
special_random_negative_finite_primitive_floats_helper::(
1,
1,
2,
1,
values,
common_values,
sample_median,
sample_moment_stats,
);
// f32, mean abs of exponent = 10, mean precision = 10
let values = &[
-0.80126953,
-0.0000013709068,
-0.015609741,
-0.98552704,
-65536.0,
-0.008257866,
-0.017333984,
-2.25,
-7.7089844,
-0.00004425831,
-0.40625,
-24576.0,
-37249.0,
-1.1991882,
-32.085938,
-0.4375,
-0.0012359619,
-1536.0,
-0.22912993,
-0.0015716553,
-1.6662057e-8,
-0.044523954,
-5694464.0,
-0.125,
-180.0,
-5.625,
-1572864.0,
-1.9092113e-7,
-0.28466797,
-0.0068359375,
-56737790.0,
-4813.375,
-20.954966,
-4.0,
-7.3125,
-3.6040926,
-0.000007293769,
-0.018554688,
-0.00009602308,
-0.000038146973,
-0.00022888184,
-36.324017,
-0.0068359375,
-0.008168057,
-20.0,
-21.398438,
-0.21679688,
-176.0,
-0.11355591,
-6144.0,
];
let common_values = &[
(-1.0, 5117),
(-1.5, 4684),
(-2.0, 4643),
(-0.5, 4592),
(-3.0, 4327),
(-0.75, 4245),
(-0.25, 4231),
(-4.0, 4186),
(-8.0, 3995),
(-0.375, 3923),
(-6.0, 3869),
(-0.125, 3864),
(-0.0625, 3534),
(-16.0, 3502),
(-0.1875, 3489),
(-12.0, 3418),
(-24.0, 3293),
(-32.0, 3244),
(-0.09375, 3209),
(-0.03125, 3152),
];
let sample_median = (-1.4882812, None);
let sample_moment_stats = MomentStats {
mean: NiceFloat(-7.110316815188854e31),
standard_deviation: NiceFloat(5.291057687231236e34),
skewness: NiceFloat(-817.3228282694379),
excess_kurtosis: NiceFloat(702102.631759681),
};
special_random_negative_finite_primitive_floats_helper::(
10,
1,
10,
1,
values,
common_values,
sample_median,
sample_moment_stats,
);
// f64, mean abs of exponent = 1/64, mean precision = 65/64
let values = &[
-1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0,
-1.0, -1.0, -1.0, -1.0, -0.5, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0,
-1.0, -1.0, -1.0, -1.0, -0.5, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0,
-1.0, -1.0, -1.0, -1.0, -1.0,
];
let common_values = &[
(-1.0, 954991),
(-1.5, 14672),
(-2.0, 14586),
(-0.5, 14578),
(-3.0, 243),
(-0.25, 228),
(-4.0, 226),
(-0.75, 207),
(-1.25, 127),
(-1.75, 118),
(-6.0, 6),
(-0.125, 4),
(-2.5, 3),
(-8.0, 3),
(-0.625, 3),
(-0.375, 2),
(-0.875, 2),
(-3.5, 1),
];
let sample_median = (-1.0, None);
let sample_moment_stats = MomentStats {
mean: NiceFloat(-1.0157463749999305),
standard_deviation: NiceFloat(0.15870215416222863),
skewness: NiceFloat(-5.805128395366302),
excess_kurtosis: NiceFloat(73.03005686221248),
};
special_random_negative_finite_primitive_floats_helper::(
1,
64,
65,
64,
values,
common_values,
sample_median,
sample_moment_stats,
);
// f64, mean abs of exponent = 1, mean precision = 2
let values = &[
-1.0, -1.5, -3.125, -1.0, -1.0, -2.0, -2.0, -1.0, -3.0, -1.0, -2.0, -3.0, -4.0, -1.5,
-1.625, -2.0, -0.125, -1.0, -0.375, -1.5, -6.375, -4.0, -6.875, -0.5, -0.234375, -1.0,
-0.2421875, -6.0, -0.75, -6.0, -6.0, -2.0, -0.21875, -2.0, -0.875, -0.875, -6.0, -16.0,
-27.0, -2.25, -1.5, -1.5, -8.75, -4.0, -0.25, -1.5, -0.375, -0.375, -1.0, -0.09375,
];
let common_values = &[
(-1.0, 166355),
(-2.0, 83686),
(-0.5, 83270),
(-1.5, 82925),
(-3.0, 41733),
(-0.75, 41659),
(-4.0, 41550),
(-0.25, 41388),
(-1.75, 21006),
(-6.0, 20858),
(-0.125, 20779),
(-8.0, 20769),
(-0.375, 20764),
(-1.25, 20753),
(-12.0, 10512),
(-2.5, 10508),
(-0.0625, 10447),
(-0.625, 10414),
(-0.1875, 10394),
(-16.0, 10354),
];
let sample_median = (-1.03125, None);
let sample_moment_stats = MomentStats {
mean: NiceFloat(-7.654060290573151),
standard_deviation: NiceFloat(374.2183970257817),
skewness: NiceFloat(-257.0774178486101),
excess_kurtosis: NiceFloat(79059.24924350459),
};
special_random_negative_finite_primitive_floats_helper::(
1,
1,
2,
1,
values,
common_values,
sample_median,
sample_moment_stats,
);
// f64, mean abs of exponent = 10, mean precision = 10
let values = &[
-0.80126953125,
-1.3709068298339844e-6,
-0.0156097412109375,
-0.9855270385742188,
-86113.82421875,
-0.012808799743652344,
-0.028076171875,
-2.75,
-7.009765625,
-0.000045569613575935364,
-0.34375,
-24576.0,
-33101.0,
-1.066680908203125,
-53.0390625,
-0.3125,
-0.0018768310546875,
-1536.0,
-0.15994291007518768,
-0.0014495849609375,
-2.5660824576334562e-8,
-0.04374957084655762,
-6583296.0,
-0.125,
-156.0,
-7.125,
-1572864.0,
-1.525198978780118e-7,
-0.32763671875,
-0.0048828125,
-47710208.0,
-6821.875,
-19.824071884155273,
-4.0,
-4.6875,
-2.3686094284057617,
-6.33427407592535e-6,
-0.0185546875,
-0.00007218122482299805,
-0.00003814697265625,
-0.0001373291015625,
-36.43232345581055,
-0.0048828125,
-0.011424465501870706,
-28.0,
-18.0546875,
-0.2207733978284523,
-144.0,
-0.083648681640625,
-4360.2293701171875,
];
let common_values = &[
(-1.0, 4779),
(-1.5, 4356),
(-2.0, 4315),
(-0.5, 4233),
(-3.0, 4023),
(-0.25, 3931),
(-0.75, 3911),
(-4.0, 3866),
(-8.0, 3705),
(-0.375, 3612),
(-6.0, 3588),
(-0.125, 3538),
(-0.0625, 3271),
(-16.0, 3264),
(-0.1875, 3199),
(-12.0, 3152),
(-24.0, 3033),
(-32.0, 2974),
(-0.09375, 2963),
(-0.03125, 2937),
];
let sample_median = (-1.484375, None);
let sample_moment_stats = MomentStats {
mean: NiceFloat(-5.352183416672257e38),
standard_deviation: NiceFloat(5.3521788476440196e41),
skewness: NiceFloat(-999.9984999986674),
excess_kurtosis: NiceFloat(999995.0000000936),
};
special_random_negative_finite_primitive_floats_helper::(
10,
1,
10,
1,
values,
common_values,
sample_median,
sample_moment_stats,
);
}
fn special_random_negative_finite_primitive_floats_fail_helper() {
assert_panic!(special_random_negative_finite_primitive_floats::(
EXAMPLE_SEED,
0,
1,
10,
1
));
assert_panic!(special_random_negative_finite_primitive_floats::(
EXAMPLE_SEED,
1,
0,
10,
1
));
assert_panic!(special_random_negative_finite_primitive_floats::(
EXAMPLE_SEED,
10,
1,
1,
1
));
assert_panic!(special_random_negative_finite_primitive_floats::(
EXAMPLE_SEED,
10,
1,
1,
0
));
}
#[test]
fn special_random_negative_finite_primitive_floats_fail() {
apply_fn_to_primitive_floats!(special_random_negative_finite_primitive_floats_fail_helper);
}