Expand description

Functions and implementations of traits for converting a Float to a primitive integer.

The traits are TryFrom, ConvertibleFrom, and RoundingFrom.

§rounding_from

use malachite_base::num::conversion::traits::RoundingFrom;
use malachite_base::rounding_modes::RoundingMode::*;
use malachite_float::Float;
use std::cmp::Ordering::*;

assert_eq!(u8::rounding_from(Float::from(1.5), Floor), (1, Less));
assert_eq!(u8::rounding_from(Float::from(1.5), Ceiling), (2, Greater));
assert_eq!(u8::rounding_from(Float::from(1.5), Nearest), (2, Greater));

assert_eq!(u8::rounding_from(Float::from(256.0), Down), (255, Less));
assert_eq!(u8::rounding_from(Float::from(256.0), Floor), (255, Less));
assert_eq!(u8::rounding_from(Float::from(256.0), Nearest), (255, Less));

assert_eq!(u8::rounding_from(Float::from(-123.0), Down), (0, Greater));
assert_eq!(
    u8::rounding_from(Float::from(-123.0), Ceiling),
    (0, Greater)
);
assert_eq!(
    u8::rounding_from(Float::from(-123.0), Nearest),
    (0, Greater)
);

assert_eq!(i8::rounding_from(Float::from(1.5), Floor), (1, Less));
assert_eq!(i8::rounding_from(Float::from(1.5), Ceiling), (2, Greater));
assert_eq!(i8::rounding_from(Float::from(1.5), Nearest), (2, Greater));

assert_eq!(i8::rounding_from(Float::from(-1.5), Floor), (-2, Less));
assert_eq!(i8::rounding_from(Float::from(-1.5), Ceiling), (-1, Greater));
assert_eq!(i8::rounding_from(Float::from(-1.5), Nearest), (-2, Less));

assert_eq!(i8::rounding_from(Float::from(128.0), Down), (127, Less));
assert_eq!(i8::rounding_from(Float::from(128.0), Floor), (127, Less));
assert_eq!(i8::rounding_from(Float::from(128.0), Nearest), (127, Less));

assert_eq!(
    i8::rounding_from(Float::from(-129.0), Down),
    (-128, Greater)
);
assert_eq!(
    i8::rounding_from(Float::from(-129.0), Ceiling),
    (-128, Greater)
);
assert_eq!(
    i8::rounding_from(Float::from(-129.0), Nearest),
    (-128, Greater)
);

assert_eq!(u8::rounding_from(&Float::from(1.5), Floor), (1, Less));
assert_eq!(u8::rounding_from(&Float::from(1.5), Ceiling), (2, Greater));
assert_eq!(u8::rounding_from(&Float::from(1.5), Nearest), (2, Greater));

assert_eq!(u8::rounding_from(&Float::from(256.0), Down), (255, Less));
assert_eq!(u8::rounding_from(&Float::from(256.0), Floor), (255, Less));
assert_eq!(u8::rounding_from(&Float::from(256.0), Nearest), (255, Less));

assert_eq!(u8::rounding_from(&Float::from(-123.0), Down), (0, Greater));
assert_eq!(
    u8::rounding_from(&Float::from(-123.0), Ceiling),
    (0, Greater)
);
assert_eq!(
    u8::rounding_from(&Float::from(-123.0), Nearest),
    (0, Greater)
);

assert_eq!(i8::rounding_from(&Float::from(1.5), Floor), (1, Less));
assert_eq!(i8::rounding_from(&Float::from(1.5), Ceiling), (2, Greater));
assert_eq!(i8::rounding_from(&Float::from(1.5), Nearest), (2, Greater));

assert_eq!(i8::rounding_from(&Float::from(-1.5), Floor), (-2, Less));
assert_eq!(
    i8::rounding_from(&Float::from(-1.5), Ceiling),
    (-1, Greater)
);
assert_eq!(i8::rounding_from(&Float::from(-1.5), Nearest), (-2, Less));

assert_eq!(i8::rounding_from(&Float::from(128.0), Down), (127, Less));
assert_eq!(i8::rounding_from(&Float::from(128.0), Floor), (127, Less));
assert_eq!(i8::rounding_from(&Float::from(128.0), Nearest), (127, Less));

assert_eq!(
    i8::rounding_from(&Float::from(-129.0), Down),
    (-128, Greater)
);
assert_eq!(
    i8::rounding_from(&Float::from(-129.0), Ceiling),
    (-128, Greater)
);
assert_eq!(
    i8::rounding_from(&Float::from(-129.0), Nearest),
    (-128, Greater)
);

§try_from

use malachite_base::num::basic::traits::{Infinity, NaN, Zero};
use malachite_base::num::conversion::from::{SignedFromFloatError, UnsignedFromFloatError};
use malachite_float::Float;

assert_eq!(u8::try_from(Float::ZERO).unwrap(), 0);
assert_eq!(u8::try_from(Float::from(123.0)).unwrap(), 123);

assert_eq!(
    u8::try_from(Float::from(-123.0)),
    Err(UnsignedFromFloatError::FloatNegative)
);
assert_eq!(
    u8::try_from(Float::from(256.0)),
    Err(UnsignedFromFloatError::FloatNonIntegerOrOutOfRange)
);
assert_eq!(
    u8::try_from(Float::from(1.5)),
    Err(UnsignedFromFloatError::FloatNonIntegerOrOutOfRange)
);
assert_eq!(
    u8::try_from(Float::INFINITY),
    Err(UnsignedFromFloatError::FloatInfiniteOrNan)
);
assert_eq!(
    u8::try_from(Float::NAN),
    Err(UnsignedFromFloatError::FloatInfiniteOrNan)
);

assert_eq!(i8::try_from(Float::ZERO).unwrap(), 0);
assert_eq!(i8::try_from(Float::from(123.0)).unwrap(), 123);
assert_eq!(i8::try_from(Float::from(-123.0)).unwrap(), -123);

assert_eq!(
    i8::try_from(Float::from(128.0)),
    Err(SignedFromFloatError::FloatNonIntegerOrOutOfRange)
);
assert_eq!(
    i8::try_from(Float::from(-129.0)),
    Err(SignedFromFloatError::FloatNonIntegerOrOutOfRange)
);
assert_eq!(
    i8::try_from(Float::from(1.5)),
    Err(SignedFromFloatError::FloatNonIntegerOrOutOfRange)
);
assert_eq!(
    i8::try_from(Float::INFINITY),
    Err(SignedFromFloatError::FloatInfiniteOrNan)
);
assert_eq!(
    i8::try_from(Float::NAN),
    Err(SignedFromFloatError::FloatInfiniteOrNan)
);

assert_eq!(u8::try_from(&Float::ZERO).unwrap(), 0);
assert_eq!(u8::try_from(&Float::from(123.0)).unwrap(), 123);

assert_eq!(
    u8::try_from(&Float::from(-123.0)),
    Err(UnsignedFromFloatError::FloatNegative)
);
assert_eq!(
    u8::try_from(&Float::from(256.0)),
    Err(UnsignedFromFloatError::FloatNonIntegerOrOutOfRange)
);
assert_eq!(
    u8::try_from(&Float::from(1.5)),
    Err(UnsignedFromFloatError::FloatNonIntegerOrOutOfRange)
);
assert_eq!(
    u8::try_from(&Float::INFINITY),
    Err(UnsignedFromFloatError::FloatInfiniteOrNan)
);
assert_eq!(
    u8::try_from(&Float::NAN),
    Err(UnsignedFromFloatError::FloatInfiniteOrNan)
);

assert_eq!(i8::try_from(&Float::ZERO).unwrap(), 0);
assert_eq!(i8::try_from(&Float::from(123.0)).unwrap(), 123);
assert_eq!(i8::try_from(&Float::from(-123.0)).unwrap(), -123);

assert_eq!(
    i8::try_from(&Float::from(128.0)),
    Err(SignedFromFloatError::FloatNonIntegerOrOutOfRange)
);
assert_eq!(
    i8::try_from(&Float::from(-129.0)),
    Err(SignedFromFloatError::FloatNonIntegerOrOutOfRange)
);
assert_eq!(
    i8::try_from(&Float::from(1.5)),
    Err(SignedFromFloatError::FloatNonIntegerOrOutOfRange)
);
assert_eq!(
    i8::try_from(&Float::INFINITY),
    Err(SignedFromFloatError::FloatInfiniteOrNan)
);
assert_eq!(
    i8::try_from(&Float::NAN),
    Err(SignedFromFloatError::FloatInfiniteOrNan)
);

§convertible_from

use malachite_base::num::basic::traits::{Infinity, NaN, Zero};
use malachite_base::num::conversion::traits::ConvertibleFrom;
use malachite_float::Float;

assert_eq!(u8::convertible_from(&Float::ZERO), true);
assert_eq!(u8::convertible_from(&Float::from(123.0)), true);

assert_eq!(u8::convertible_from(&Float::from(256.0)), false);
assert_eq!(u8::convertible_from(&Float::from(-123.0)), false);
assert_eq!(u8::convertible_from(&Float::from(1.5)), false);
assert_eq!(u8::convertible_from(&Float::INFINITY), false);
assert_eq!(u8::convertible_from(&Float::NAN), false);

assert_eq!(i8::convertible_from(&Float::ZERO), true);
assert_eq!(i8::convertible_from(&Float::from(123.0)), true);
assert_eq!(i8::convertible_from(&Float::from(-123.0)), true);

assert_eq!(i8::convertible_from(&Float::from(128.0)), false);
assert_eq!(i8::convertible_from(&Float::from(-129.0)), false);
assert_eq!(i8::convertible_from(&Float::from(1.5)), false);
assert_eq!(i8::convertible_from(&Float::INFINITY), false);
assert_eq!(i8::convertible_from(&Float::NAN), false);