From: Mark Thom Date: Sat, 25 May 2019 04:16:07 +0000 (-0400) Subject: pass more numbers by reference X-Git-Tag: v0.8.110~57 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=ea9cfa6d400cf8e7316b17a07c705b91f3dff636;p=scryer-prolog.git pass more numbers by reference --- diff --git a/Cargo.toml b/Cargo.toml index cd90aa10..f2396afa 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "scryer-prolog" -version = "0.8.84" +version = "0.8.85" authors = ["Mark Thom "] repository = "https://github.com/mthom/scryer-prolog" description = "A modern Prolog implementation written mostly in Rust." diff --git a/src/prolog/arithmetic.rs b/src/prolog/arithmetic.rs index b9115793..fc83a36f 100644 --- a/src/prolog/arithmetic.rs +++ b/src/prolog/arithmetic.rs @@ -309,7 +309,12 @@ pub fn result_f(n: &Number, round: Round) -> Result where Round: Fn(&Number) -> f64 { let f = rnd_f(n); + classify_float(f, round) +} +fn classify_float(f: f64, round: Round) -> Result + where Round: Fn(&Number) -> f64 +{ match f.classify() { FpCategory::Normal | FpCategory::Zero => Ok(round(&Number::Float(OrderedFloat(f)))), @@ -324,30 +329,30 @@ pub fn result_f(n: &Number, round: Round) -> Result }, FpCategory::Nan => Err(EvalError::Undefined), _ => Ok(round(&Number::Float(OrderedFloat(f)))) - } + } } -fn float_i_to_f(n: Integer) -> Result { - result_f(&Number::Integer(n), rnd_f) +fn float_i_to_f(n: &Integer) -> Result { + classify_float(n.to_f64(), rnd_f) } -fn float_r_to_f(r: Rational) -> Result { - result_f(&Number::Rational(r), rnd_f) +fn float_r_to_f(r: &Rational) -> Result { + classify_float(r.to_f64(), rnd_f) } fn add_f(f1: f64, f2: f64) -> Result, EvalError> { - Ok(OrderedFloat(result_f(&Number::Float(OrderedFloat(f1 + f2)), rnd_f)?)) + Ok(OrderedFloat(classify_float(f1 + f2, rnd_f)?)) } fn mul_f(f1: f64, f2: f64) -> Result, EvalError> { - Ok(OrderedFloat(result_f(&Number::Float(OrderedFloat(f1 * f2)), rnd_f)?)) + Ok(OrderedFloat(classify_float(f1 * f2, rnd_f)?)) } fn div_f(f1: f64, f2: f64) -> Result, EvalError> { if FpCategory::Zero == f2.classify() { Err(EvalError::ZeroDivisor) } else { - Ok(OrderedFloat(result_f(&Number::Float(OrderedFloat(f1 / f2)), rnd_f)?)) + Ok(OrderedFloat(classify_float(f1 / f2, rnd_f)?)) } } @@ -360,13 +365,13 @@ impl Add for Number { Ok(Number::Integer(n1 + n2)), // add_i (Number::Integer(n1), Number::Float(OrderedFloat(n2))) | (Number::Float(OrderedFloat(n2)), Number::Integer(n1)) => - Ok(Number::Float(add_f(float_i_to_f(n1)?, n2)?)), + Ok(Number::Float(add_f(float_i_to_f(&n1)?, n2)?)), (Number::Integer(n1), Number::Rational(n2)) | (Number::Rational(n2), Number::Integer(n1)) => Ok(Number::Rational(Rational::from(n1) + n2)), (Number::Rational(n1), Number::Float(OrderedFloat(n2))) | (Number::Float(OrderedFloat(n2)), Number::Rational(n1)) => - Ok(Number::Float(add_f(float_r_to_f(n1)?, n2)?)), + Ok(Number::Float(add_f(float_r_to_f(&n1)?, n2)?)), (Number::Float(OrderedFloat(f1)), Number::Float(OrderedFloat(f2))) => Ok(Number::Float(add_f(f1, f2)?)), (Number::Rational(r1), Number::Rational(r2)) => @@ -403,14 +408,14 @@ impl Mul for Number { (Number::Integer(n1), Number::Integer(n2)) => Ok(Number::Integer(n1 * n2)), // mul_i (Number::Integer(n1), Number::Float(OrderedFloat(n2))) - | (Number::Float(OrderedFloat(n2)), Number::Integer(n1)) => - Ok(Number::Float(mul_f(float_i_to_f(n1)?, n2)?)), + | (Number::Float(OrderedFloat(n2)), Number::Integer(n1)) => + Ok(Number::Float(mul_f(float_i_to_f(&n1)?, n2)?)), (Number::Integer(n1), Number::Rational(n2)) - | (Number::Rational(n2), Number::Integer(n1)) => + | (Number::Rational(n2), Number::Integer(n1)) => Ok(Number::Rational(Rational::from(n1) * n2)), (Number::Rational(n1), Number::Float(OrderedFloat(n2))) - | (Number::Float(OrderedFloat(n2)), Number::Rational(n1)) => - Ok(Number::Float(mul_f(float_r_to_f(n1)?, n2)?)), + | (Number::Float(OrderedFloat(n2)), Number::Rational(n1)) => + Ok(Number::Float(mul_f(float_r_to_f(&n1)?, n2)?)), (Number::Float(OrderedFloat(f1)), Number::Float(OrderedFloat(f2))) => Ok(Number::Float(mul_f(f1, f2)?)), (Number::Rational(r1), Number::Rational(r2)) => @@ -425,23 +430,23 @@ impl Div for Number { fn div(self, rhs: Number) -> Self::Output { match (self, rhs) { (Number::Integer(n1), Number::Integer(n2)) => - Ok(Number::Float(div_f(float_i_to_f(n1)?, float_i_to_f(n2)?)?)), + Ok(Number::Float(div_f(float_i_to_f(&n1)?, float_i_to_f(&n2)?)?)), (Number::Integer(n1), Number::Float(OrderedFloat(n2))) => - Ok(Number::Float(div_f(float_i_to_f(n1)?, n2)?)), + Ok(Number::Float(div_f(float_i_to_f(&n1)?, n2)?)), (Number::Float(OrderedFloat(n2)), Number::Integer(n1)) => - Ok(Number::Float(div_f(n2, float_i_to_f(n1)?)?)), + Ok(Number::Float(div_f(n2, float_i_to_f(&n1)?)?)), (Number::Integer(n1), Number::Rational(n2)) => - Ok(Number::Float(div_f(float_i_to_f(n1)?, float_r_to_f(n2)?)?)), + Ok(Number::Float(div_f(float_i_to_f(&n1)?, float_r_to_f(&n2)?)?)), (Number::Rational(n2), Number::Integer(n1)) => - Ok(Number::Float(div_f(float_r_to_f(n2)?, float_i_to_f(n1)?)?)), + Ok(Number::Float(div_f(float_r_to_f(&n2)?, float_i_to_f(&n1)?)?)), (Number::Rational(n1), Number::Float(OrderedFloat(n2))) => - Ok(Number::Float(div_f(float_r_to_f(n1)?, n2)?)), + Ok(Number::Float(div_f(float_r_to_f(&n1)?, n2)?)), (Number::Float(OrderedFloat(n2)), Number::Rational(n1)) => - Ok(Number::Float(div_f(n2, float_r_to_f(n1)?)?)), + Ok(Number::Float(div_f(n2, float_r_to_f(&n1)?)?)), (Number::Float(OrderedFloat(f1)), Number::Float(OrderedFloat(f2))) => Ok(Number::Float(div_f(f1, f2)?)), (Number::Rational(r1), Number::Rational(r2)) => - Ok(Number::Float(div_f(float_r_to_f(r1)?, float_r_to_f(r2)?)?)) + Ok(Number::Float(div_f(float_r_to_f(&r1)?, float_r_to_f(&r2)?)?)) } } }