From: Mark Thom Date: Mon, 20 Apr 2020 03:34:59 +0000 (-0600) Subject: do casts between different arithmetic types for comparison and equality (#372) X-Git-Tag: v0.8.123~119 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=5a1348e4d1f1ba1f4546d6346a5140dca05da7e7;p=scryer-prolog.git do casts between different arithmetic types for comparison and equality (#372) --- diff --git a/src/prolog/arithmetic.rs b/src/prolog/arithmetic.rs index 3b84bf30..5be0001b 100644 --- a/src/prolog/arithmetic.rs +++ b/src/prolog/arithmetic.rs @@ -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), }