Here is a simple implementation of the "back of the envelope":
const INTEGRAL_LIMIT: f64 = 9007199254740992.0; #[derive(Debug, PartialEq, Eq)] enum Error { NaN, Overflow, Underflow, } fn try_from(f: f64) -> Result<i64, Error> { let f = f.round(); if f.is_nan() { return Err(Error::NaN); } if f < -INTEGRAL_LIMIT { return Err(Error::Underflow); } if f > INTEGRAL_LIMIT { return Err(Error::Overflow); } Ok(f as i64) }
And it comes with a minimal test suite that passes:
fn main() { assert_eq!(try_from(std::f64::NAN), Err(Error::NaN)); assert_eq!(try_from(std::f64::NEG_INFINITY), Err(Error::Underflow)); assert_eq!(try_from(-9007199254740994.0), Err(Error::Underflow)); assert_eq!(try_from( 9007199254740994.0), Err(Error::Overflow)); assert_eq!(try_from(std::f64::INFINITY), Err(Error::Overflow)); assert_eq!(try_from(-INTEGRAL_LIMIT), Ok(-9007199254740992)); assert_eq!(try_from( INTEGRAL_LIMIT), Ok( 9007199254740992)); }
I really expected the implementation of TryFrom be available, but not found.
source share