Expand description

Functions and implementations of traits for converting a Rational to a primitive float.

The traits are TryFrom, ConvertibleFrom, and RoundingFrom.

§rounding_from

use malachite_base::num::arithmetic::traits::PowerOf2;
use malachite_base::num::basic::floats::PrimitiveFloat;
use malachite_base::num::basic::traits::OneHalf;
use malachite_base::num::conversion::traits::RoundingFrom;
use malachite_base::num::float::NiceFloat;
use malachite_base::rounding_modes::RoundingMode;
use malachite_q::Rational;
use std::cmp::Ordering;

let one_third = Rational::from_signeds(1i8, 3);
assert_eq!(
    f32::rounding_from(one_third.clone(), RoundingMode::Floor),
    (0.3333333, Ordering::Less)
);
assert_eq!(
    f32::rounding_from(one_third, RoundingMode::Ceiling),
    (0.33333334, Ordering::Greater)
);
assert_eq!(
    f32::rounding_from(Rational::ONE_HALF, RoundingMode::Exact),
    (0.5, Ordering::Equal)
);
let big = Rational::power_of_2(200u64);
assert_eq!(
    f32::rounding_from(big.clone(), RoundingMode::Down),
    (f32::MAX_FINITE, Ordering::Less)
);
assert_eq!(f32::rounding_from(big, RoundingMode::Up), (f32::INFINITY, Ordering::Greater));
let small = Rational::power_of_2(-200i64);
let (rounded, o) = f32::rounding_from(small.clone(), RoundingMode::Down);
assert_eq!(NiceFloat(rounded), NiceFloat(0.0));
assert_eq!(o, Ordering::Less);
assert_eq!(
    f32::rounding_from(small.clone(), RoundingMode::Up),
    (f32::MIN_POSITIVE_SUBNORMAL, Ordering::Greater)
);
let (rounded, o) = f32::rounding_from(-&small, RoundingMode::Down);
assert_eq!(NiceFloat(rounded), NiceFloat(-0.0));
assert_eq!(o, Ordering::Greater);
assert_eq!(
    f32::rounding_from(-small, RoundingMode::Up),
    (-f32::MIN_POSITIVE_SUBNORMAL, Ordering::Less)
);

let one_third = Rational::from_signeds(1i8, 3);
assert_eq!(f32::rounding_from(&one_third, RoundingMode::Floor), (0.3333333, Ordering::Less));
assert_eq!(
    f32::rounding_from(&one_third, RoundingMode::Ceiling),
    (0.33333334, Ordering::Greater)
);
assert_eq!(
    f32::rounding_from(&Rational::ONE_HALF, RoundingMode::Exact),
    (0.5, Ordering::Equal)
);
let big = Rational::power_of_2(200u64);
assert_eq!(f32::rounding_from(&big, RoundingMode::Down), (f32::MAX_FINITE, Ordering::Less));
assert_eq!(f32::rounding_from(&big, RoundingMode::Up), (f32::INFINITY, Ordering::Greater));
let small = Rational::power_of_2(-200i64);
let (rounded, o) = f32::rounding_from(small.clone(), RoundingMode::Down);
assert_eq!(NiceFloat(rounded), NiceFloat(0.0));
assert_eq!(o, Ordering::Less);
assert_eq!(
    f32::rounding_from(&small, RoundingMode::Up),
    (f32::MIN_POSITIVE_SUBNORMAL, Ordering::Greater)
);
let (rounded, o) = f32::rounding_from(-&small, RoundingMode::Down);
assert_eq!(NiceFloat(rounded), NiceFloat(-0.0));
assert_eq!(o, Ordering::Greater);
assert_eq!(
    f32::rounding_from(&-small, RoundingMode::Up),
    (-f32::MIN_POSITIVE_SUBNORMAL, Ordering::Less)
);

§try_from

use malachite_base::num::arithmetic::traits::PowerOf2;
use malachite_base::num::basic::traits::OneHalf;
use malachite_q::conversion::primitive_float_from_rational::FloatFromRationalError;
use malachite_q::Rational;

assert_eq!(
    f32::try_from(Rational::from_signeds(1i8, 3)),
    Err(FloatFromRationalError)
);
assert_eq!(f32::try_from(Rational::ONE_HALF), Ok(0.5));
assert_eq!(f32::try_from(Rational::power_of_2(200u64)), Err(FloatFromRationalError));
assert_eq!(f32::try_from(Rational::power_of_2(-200i64)), Err(FloatFromRationalError));
assert_eq!(
    f32::try_from(-Rational::power_of_2(-200i64)),
    Err(FloatFromRationalError)
);

assert_eq!(
    f32::try_from(&Rational::from_signeds(1i8, 3)),
    Err(FloatFromRationalError)
);
assert_eq!(f32::try_from(&Rational::ONE_HALF), Ok(0.5));
assert_eq!(f32::try_from(&Rational::power_of_2(200u64)), Err(FloatFromRationalError));
assert_eq!(
    f32::try_from(&Rational::power_of_2(-200i64)), Err(FloatFromRationalError)
);
assert_eq!(
    f32::try_from(&-Rational::power_of_2(-200i64)), Err(FloatFromRationalError)
);

§convertible_from

use malachite_base::num::arithmetic::traits::PowerOf2;
use malachite_base::num::conversion::traits::ConvertibleFrom;
use malachite_base::num::basic::traits::OneHalf;
use malachite_q::Rational;

assert_eq!(f32::convertible_from(Rational::from_signeds(1i8, 3)), false);
assert_eq!(f32::convertible_from(Rational::ONE_HALF), true);
assert_eq!(f32::convertible_from(Rational::power_of_2(200u64)), false);
assert_eq!(f32::convertible_from(Rational::power_of_2(-200i64)), false);
assert_eq!(f32::convertible_from(-Rational::power_of_2(-200i64)), false);

assert_eq!(f32::convertible_from(&Rational::from_signeds(1i8, 3)), false);
assert_eq!(f32::convertible_from(&Rational::ONE_HALF), true);
assert_eq!(f32::convertible_from(&Rational::power_of_2(200u64)), false);
assert_eq!(f32::convertible_from(&Rational::power_of_2(-200i64)), false);
assert_eq!(f32::convertible_from(&-Rational::power_of_2(-200i64)), false);

Structs§