]> Repositorios git - scryer-prolog.git/commitdiff
coerce rationals to floats before coercing floats to rationals.
authorMark Thom <[email protected]>
Sun, 3 Dec 2017 22:16:40 +0000 (15:16 -0700)
committerMark Thom <[email protected]>
Sun, 3 Dec 2017 22:16:40 +0000 (15:16 -0700)
src/prolog/ast.rs

index 720919f9adb35a28c3be3f82f2ae88160e71c4f8..d684d176b44fc96891b313279fa5f920dd89a6ea 100644 (file)
@@ -484,14 +484,18 @@ impl NumberPair {
     }
 
     fn float_rational_pair(n1: OrderedFloat<f64>, n2: Ratio<BigInt>) -> 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()))
+            }
         }
     }