]> Repositorios git - scryer-prolog.git/commitdiff
do casts between different arithmetic types for comparison and equality (#372)
authorMark Thom <[email protected]>
Mon, 20 Apr 2020 03:34:59 +0000 (21:34 -0600)
committerMark Thom <[email protected]>
Mon, 20 Apr 2020 03:34:59 +0000 (21:34 -0600)
src/prolog/arithmetic.rs

index 3b84bf3031f8cade8f2d209ce42fda694da430a8..5be0001bcc127739698990d437ee7760239a5b04 100644 (file)
@@ -632,15 +632,15 @@ impl PartialEq for Number {
             (&Number::Integer(ref n1), &Number::Fixnum(n2)) => (&**n1).eq(&n2),
             (&Number::Fixnum(n1), &Number::Rational(ref n2)) => n1.eq(&**n2),
             (&Number::Rational(ref n1), &Number::Fixnum(n2)) => (&**n1).eq(&n2),
-            (&Number::Fixnum(_), &Number::Float(OrderedFloat(_))) => false,
-            (&Number::Float(OrderedFloat(_)), &Number::Fixnum(_)) => false,
+            (&Number::Fixnum(n1), &Number::Float(n2)) => OrderedFloat(n1 as f64).eq(&n2),
+            (&Number::Float(n1), &Number::Fixnum(n2)) => n1.eq(&OrderedFloat(n2 as f64)),
             (&Number::Integer(ref n1), &Number::Integer(ref n2)) => n1.eq(n2),
-            (&Number::Integer(_), Number::Float(_)) => false,
-            (&Number::Float(_), &Number::Integer(_)) => false,
-            (&Number::Integer(_), &Number::Rational(_)) => false,
-            (&Number::Rational(_), &Number::Integer(_)) => false,
-            (&Number::Rational(_), Number::Float(_)) => false,
-            (&Number::Float(_), &Number::Rational(_)) => false,
+            (&Number::Integer(ref n1), Number::Float(n2)) => OrderedFloat(n1.to_f64()).eq(&n2),
+            (&Number::Float(n1), &Number::Integer(ref n2)) => n1.eq(&OrderedFloat(n2.to_f64())),
+            (&Number::Integer(ref n1), &Number::Rational(ref n2)) => &**n1 == &**n2,
+            (&Number::Rational(ref n1), &Number::Integer(ref n2)) => &**n1 == &**n2,
+            (&Number::Rational(ref n1), &Number::Float(n2)) => OrderedFloat(n1.to_f64()).eq(&n2),
+            (&Number::Float(n1), &Number::Rational(ref n2)) => n1.eq(&OrderedFloat(n2.to_f64())),
             (&Number::Float(f1), &Number::Float(f2)) => f1.eq(&f2),
             (&Number::Rational(ref r1), &Number::Rational(ref r2)) => r1.eq(&r2),
         }
@@ -663,15 +663,17 @@ impl Ord for Number {
             (Number::Integer(n1), &Number::Fixnum(n2)) => (&**n1).cmp(&Integer::from(n2)),
             (&Number::Fixnum(n1), Number::Rational(n2)) => Rational::from(n1).cmp(&*n2),
             (Number::Rational(n1), &Number::Fixnum(n2)) => (&**n1).cmp(&Rational::from(n2)),
-            (&Number::Fixnum(_), &Number::Float(OrderedFloat(_))) => Ordering::Greater,
-            (&Number::Float(OrderedFloat(_)), &Number::Fixnum(_)) => Ordering::Less,
+            (&Number::Fixnum(n1), &Number::Float(n2)) => OrderedFloat(n1 as f64).cmp(&n2),
+            (&Number::Float(n1), &Number::Fixnum(n2)) => n1.cmp(&OrderedFloat(n2 as f64)),
             (&Number::Integer(ref n1), &Number::Integer(ref n2)) => n1.cmp(n2),
-            (&Number::Integer(_), Number::Float(_)) => Ordering::Greater,
-            (&Number::Float(_), &Number::Integer(_)) => Ordering::Less,
-            (&Number::Integer(_), &Number::Rational(_)) => Ordering::Greater,
-            (&Number::Rational(_), &Number::Integer(_)) => Ordering::Less,
-            (&Number::Rational(_), Number::Float(_)) => Ordering::Greater,
-            (&Number::Float(_), &Number::Rational(_)) => Ordering::Less,
+            (&Number::Integer(ref n1), Number::Float(n2)) => OrderedFloat(n1.to_f64()).cmp(&n2),
+            (&Number::Float(n1), &Number::Integer(ref n2)) => n1.cmp(&OrderedFloat(n2.to_f64())),
+            (&Number::Integer(ref n1), &Number::Rational(ref n2)) =>
+                (&**n1).partial_cmp(&**n2).unwrap_or(Ordering::Less),
+            (&Number::Rational(ref n1), &Number::Integer(ref n2)) =>
+                (&**n1).partial_cmp(&**n2).unwrap_or(Ordering::Less),
+            (&Number::Rational(ref n1), &Number::Float(n2)) => OrderedFloat(n1.to_f64()).cmp(&n2),
+            (&Number::Float(n1), &Number::Rational(ref n2)) => n1.cmp(&OrderedFloat(n2.to_f64())),
             (&Number::Float(f1), &Number::Float(f2)) => f1.cmp(&f2),
             (&Number::Rational(ref r1), &Number::Rational(ref r2)) => r1.cmp(&r2),
         }