From: Mark Thom Date: Sun, 3 Dec 2017 22:16:40 +0000 (-0700) Subject: coerce rationals to floats before coercing floats to rationals. X-Git-Tag: v0.8.110~660 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=db38f091a80be22974404721b0157adceac5e87f;p=scryer-prolog.git coerce rationals to floats before coercing floats to rationals. --- diff --git a/src/prolog/ast.rs b/src/prolog/ast.rs index 720919f9..d684d176 100644 --- a/src/prolog/ast.rs +++ b/src/prolog/ast.rs @@ -484,14 +484,18 @@ impl NumberPair { } fn float_rational_pair(n1: OrderedFloat, n2: Ratio) -> NumberPair { - if let Some(r) = Ratio::from_float(n1.into_inner()) { - NumberPair::Rational(r, n2) - } else if n1.into_inner().is_sign_positive() { - NumberPair::Float(OrderedFloat(f64::infinity()), - OrderedFloat(f64::infinity())) - } else { - NumberPair::Float(OrderedFloat(f64::neg_infinity()), - OrderedFloat(f64::neg_infinity())) + match (n2.numer().to_f64(), n2.denom().to_f64()) { + (Some(num), Some(denom)) => + NumberPair::Float(n1, OrderedFloat(num / denom)), + _ => if let Some(r) = Ratio::from_float(n1.into_inner()) { + NumberPair::Rational(r, n2) + } else if n1.into_inner().is_sign_positive() { + NumberPair::Float(OrderedFloat(f64::infinity()), + OrderedFloat(f64::infinity())) + } else { + NumberPair::Float(OrderedFloat(f64::neg_infinity()), + OrderedFloat(f64::neg_infinity())) + } } }