jeudi 4 août 2022

Why can I not use the MAX and MIN values of f32 and f64 in a call to rand::rngs::ThreadRng::gen_range() in Rust

I have a utility I've written to generate dummy data. For example, you might write:

giveme 12000 u32

... to get an array of 12000 32-bit unsigned integers.

It is possible to set a maximum and/or minimum allowed value, so you might write:

giveme 100 f32 --max=155.25

If one or the other is not given, the programme uses type::MAX and type::MIN.

With the floating point types, however, one cannot pass those values to rand::rngs::ThreadRng::gen_range().

Here is my code for the f64:

fn generate_gift(gift_type: &    GiftType,
                 generator: &mut rand::rngs::ThreadRng,
                 min:            Option<f64>,
                 max:            Option<f64>) -> Gift
{
    match gift_type
    {
        ...
        GiftType::Float64 =>
        {
            let _min: f64 = min.unwrap_or(f64::MIN);
            let _max: f64 = max.unwrap_or(f64::MAX);
            let x: f64 = generator.gen_range(_min..=_max);
            Gift::Float64(x)
        },
    }
}

If one or both of the limits is missing for floating point, 32 or 64-bit, then I get this error:

thread 'main' panicked at 'UniformSampler::sample_single: range overflow', /home/jack/.cargo/registry/src/github.com-1ecc6299db9ec823/rand-0.8.5/src/distributions/uniform.rs:998:1
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

It is not obvious to me at all why this error arises. Can you shed any light upon it?




Aucun commentaire:

Enregistrer un commentaire