fix floor for f64 (#1223)

This commit is contained in:
Mark Thom
2022-01-17 22:04:10 -07:00
parent 97b9d488d4
commit b980ae1e8c
2 changed files with 40 additions and 40 deletions

View File

@@ -617,83 +617,83 @@ enum InstructionTemplate {
#[strum_discriminants(strum(props(Arity = "1", Name = "default_trust_me")))] #[strum_discriminants(strum(props(Arity = "1", Name = "default_trust_me")))]
TryMeElse(usize), TryMeElse(usize),
// arithmetic instruction // arithmetic instruction
#[strum_discriminants(strum(props(Arity = "3", Name = "add")))] #[strum_discriminants(strum(props(Arity = "2", Name = "add")))]
Add(ArithmeticTerm, ArithmeticTerm, usize), Add(ArithmeticTerm, ArithmeticTerm, usize),
#[strum_discriminants(strum(props(Arity = "3", Name = "sub")))] #[strum_discriminants(strum(props(Arity = "2", Name = "sub")))]
Sub(ArithmeticTerm, ArithmeticTerm, usize), Sub(ArithmeticTerm, ArithmeticTerm, usize),
#[strum_discriminants(strum(props(Arity = "3", Name = "mul")))] #[strum_discriminants(strum(props(Arity = "2", Name = "mul")))]
Mul(ArithmeticTerm, ArithmeticTerm, usize), Mul(ArithmeticTerm, ArithmeticTerm, usize),
#[strum_discriminants(strum(props(Arity = "3", Name = "pow")))] #[strum_discriminants(strum(props(Arity = "2", Name = "pow")))]
Pow(ArithmeticTerm, ArithmeticTerm, usize), Pow(ArithmeticTerm, ArithmeticTerm, usize),
#[strum_discriminants(strum(props(Arity = "3", Name = "int_pow")))] #[strum_discriminants(strum(props(Arity = "2", Name = "int_pow")))]
IntPow(ArithmeticTerm, ArithmeticTerm, usize), IntPow(ArithmeticTerm, ArithmeticTerm, usize),
#[strum_discriminants(strum(props(Arity = "3", Name = "i_div")))] #[strum_discriminants(strum(props(Arity = "2", Name = "i_div")))]
IDiv(ArithmeticTerm, ArithmeticTerm, usize), IDiv(ArithmeticTerm, ArithmeticTerm, usize),
#[strum_discriminants(strum(props(Arity = "3", Name = "max")))] #[strum_discriminants(strum(props(Arity = "2", Name = "max")))]
Max(ArithmeticTerm, ArithmeticTerm, usize), Max(ArithmeticTerm, ArithmeticTerm, usize),
#[strum_discriminants(strum(props(Arity = "3", Name = "min")))] #[strum_discriminants(strum(props(Arity = "2", Name = "min")))]
Min(ArithmeticTerm, ArithmeticTerm, usize), Min(ArithmeticTerm, ArithmeticTerm, usize),
#[strum_discriminants(strum(props(Arity = "3", Name = "int_floor_div")))] #[strum_discriminants(strum(props(Arity = "1", Name = "int_floor_div")))]
IntFloorDiv(ArithmeticTerm, ArithmeticTerm, usize), IntFloorDiv(ArithmeticTerm, ArithmeticTerm, usize),
#[strum_discriminants(strum(props(Arity = "3", Name = "r_div")))] #[strum_discriminants(strum(props(Arity = "2", Name = "r_div")))]
RDiv(ArithmeticTerm, ArithmeticTerm, usize), RDiv(ArithmeticTerm, ArithmeticTerm, usize),
#[strum_discriminants(strum(props(Arity = "3", Name = "div")))] #[strum_discriminants(strum(props(Arity = "2", Name = "div")))]
Div(ArithmeticTerm, ArithmeticTerm, usize), Div(ArithmeticTerm, ArithmeticTerm, usize),
#[strum_discriminants(strum(props(Arity = "3", Name = "shl")))] #[strum_discriminants(strum(props(Arity = "2", Name = "shl")))]
Shl(ArithmeticTerm, ArithmeticTerm, usize), Shl(ArithmeticTerm, ArithmeticTerm, usize),
#[strum_discriminants(strum(props(Arity = "3", Name = "shr")))] #[strum_discriminants(strum(props(Arity = "2", Name = "shr")))]
Shr(ArithmeticTerm, ArithmeticTerm, usize), Shr(ArithmeticTerm, ArithmeticTerm, usize),
#[strum_discriminants(strum(props(Arity = "3", Name = "xor")))] #[strum_discriminants(strum(props(Arity = "2", Name = "xor")))]
Xor(ArithmeticTerm, ArithmeticTerm, usize), Xor(ArithmeticTerm, ArithmeticTerm, usize),
#[strum_discriminants(strum(props(Arity = "3", Name = "and")))] #[strum_discriminants(strum(props(Arity = "2", Name = "and")))]
And(ArithmeticTerm, ArithmeticTerm, usize), And(ArithmeticTerm, ArithmeticTerm, usize),
#[strum_discriminants(strum(props(Arity = "3", Name = "or")))] #[strum_discriminants(strum(props(Arity = "2", Name = "or")))]
Or(ArithmeticTerm, ArithmeticTerm, usize), Or(ArithmeticTerm, ArithmeticTerm, usize),
#[strum_discriminants(strum(props(Arity = "3", Name = "mod")))] #[strum_discriminants(strum(props(Arity = "2", Name = "mod")))]
Mod(ArithmeticTerm, ArithmeticTerm, usize), Mod(ArithmeticTerm, ArithmeticTerm, usize),
#[strum_discriminants(strum(props(Arity = "3", Name = "rem")))] #[strum_discriminants(strum(props(Arity = "2", Name = "rem")))]
Rem(ArithmeticTerm, ArithmeticTerm, usize), Rem(ArithmeticTerm, ArithmeticTerm, usize),
#[strum_discriminants(strum(props(Arity = "3", Name = "gcd")))] #[strum_discriminants(strum(props(Arity = "2", Name = "gcd")))]
Gcd(ArithmeticTerm, ArithmeticTerm, usize), Gcd(ArithmeticTerm, ArithmeticTerm, usize),
#[strum_discriminants(strum(props(Arity = "2", Name = "sign")))] #[strum_discriminants(strum(props(Arity = "1", Name = "sign")))]
Sign(ArithmeticTerm, usize), Sign(ArithmeticTerm, usize),
#[strum_discriminants(strum(props(Arity = "2", Name = "cos")))] #[strum_discriminants(strum(props(Arity = "1", Name = "cos")))]
Cos(ArithmeticTerm, usize), Cos(ArithmeticTerm, usize),
#[strum_discriminants(strum(props(Arity = "2", Name = "sin")))] #[strum_discriminants(strum(props(Arity = "1", Name = "sin")))]
Sin(ArithmeticTerm, usize), Sin(ArithmeticTerm, usize),
#[strum_discriminants(strum(props(Arity = "2", Name = "tan")))] #[strum_discriminants(strum(props(Arity = "1", Name = "tan")))]
Tan(ArithmeticTerm, usize), Tan(ArithmeticTerm, usize),
#[strum_discriminants(strum(props(Arity = "2", Name = "log")))] #[strum_discriminants(strum(props(Arity = "1", Name = "log")))]
Log(ArithmeticTerm, usize), Log(ArithmeticTerm, usize),
#[strum_discriminants(strum(props(Arity = "2", Name = "exp")))] #[strum_discriminants(strum(props(Arity = "1", Name = "exp")))]
Exp(ArithmeticTerm, usize), Exp(ArithmeticTerm, usize),
#[strum_discriminants(strum(props(Arity = "2", Name = "acos")))] #[strum_discriminants(strum(props(Arity = "1", Name = "acos")))]
ACos(ArithmeticTerm, usize), ACos(ArithmeticTerm, usize),
#[strum_discriminants(strum(props(Arity = "2", Name = "asin")))] #[strum_discriminants(strum(props(Arity = "1", Name = "asin")))]
ASin(ArithmeticTerm, usize), ASin(ArithmeticTerm, usize),
#[strum_discriminants(strum(props(Arity = "2", Name = "atan")))] #[strum_discriminants(strum(props(Arity = "1", Name = "atan")))]
ATan(ArithmeticTerm, usize), ATan(ArithmeticTerm, usize),
#[strum_discriminants(strum(props(Arity = "3", Name = "atan2")))] #[strum_discriminants(strum(props(Arity = "1", Name = "atan2")))]
ATan2(ArithmeticTerm, ArithmeticTerm, usize), ATan2(ArithmeticTerm, ArithmeticTerm, usize),
#[strum_discriminants(strum(props(Arity = "2", Name = "sqrt")))] #[strum_discriminants(strum(props(Arity = "1", Name = "sqrt")))]
Sqrt(ArithmeticTerm, usize), Sqrt(ArithmeticTerm, usize),
#[strum_discriminants(strum(props(Arity = "2", Name = "abs")))] #[strum_discriminants(strum(props(Arity = "1", Name = "abs")))]
Abs(ArithmeticTerm, usize), Abs(ArithmeticTerm, usize),
#[strum_discriminants(strum(props(Arity = "2", Name = "float")))] #[strum_discriminants(strum(props(Arity = "1", Name = "float")))]
Float(ArithmeticTerm, usize), Float(ArithmeticTerm, usize),
#[strum_discriminants(strum(props(Arity = "2", Name = "truncate")))] #[strum_discriminants(strum(props(Arity = "1", Name = "truncate")))]
Truncate(ArithmeticTerm, usize), Truncate(ArithmeticTerm, usize),
#[strum_discriminants(strum(props(Arity = "2", Name = "round")))] #[strum_discriminants(strum(props(Arity = "1", Name = "round")))]
Round(ArithmeticTerm, usize), Round(ArithmeticTerm, usize),
#[strum_discriminants(strum(props(Arity = "2", Name = "ceiling")))] #[strum_discriminants(strum(props(Arity = "1", Name = "ceiling")))]
Ceiling(ArithmeticTerm, usize), Ceiling(ArithmeticTerm, usize),
#[strum_discriminants(strum(props(Arity = "2", Name = "floor")))] #[strum_discriminants(strum(props(Arity = "1", Name = "floor")))]
Floor(ArithmeticTerm, usize), Floor(ArithmeticTerm, usize),
#[strum_discriminants(strum(props(Arity = "2", Name = "neg")))] #[strum_discriminants(strum(props(Arity = "1", Name = "neg")))]
Neg(ArithmeticTerm, usize), Neg(ArithmeticTerm, usize),
#[strum_discriminants(strum(props(Arity = "2", Name = "plus")))] #[strum_discriminants(strum(props(Arity = "1", Name = "plus")))]
Plus(ArithmeticTerm, usize), Plus(ArithmeticTerm, usize),
#[strum_discriminants(strum(props(Arity = "2", Name = "bitwise_complement")))] #[strum_discriminants(strum(props(Arity = "1", Name = "bitwise_complement")))]
BitwiseComplement(ArithmeticTerm, usize), BitwiseComplement(ArithmeticTerm, usize),
// control instructions // control instructions
#[strum_discriminants(strum(props(Arity = "1", Name = "allocate")))] #[strum_discriminants(strum(props(Arity = "1", Name = "allocate")))]

View File

@@ -345,7 +345,7 @@ impl<'a> ArithmeticEvaluator<'a> {
pub(crate) fn rnd_i<'a>(n: &'a Number, arena: &mut Arena) -> Number { pub(crate) fn rnd_i<'a>(n: &'a Number, arena: &mut Arena) -> Number {
match n { match n {
&Number::Integer(_) | &Number::Fixnum(_) => *n, &Number::Integer(_) | &Number::Fixnum(_) => *n,
&Number::Float(OrderedFloat(f)) => fixnum!(Number, f.round() as i64, arena), &Number::Float(OrderedFloat(f)) => fixnum!(Number, f.floor() as i64, arena),
&Number::Rational(ref r) => { &Number::Rational(ref r) => {
let r_ref = r.fract_floor_ref(); let r_ref = r.fract_floor_ref();
let (mut fract, mut floor) = (Rational::new(), Integer::new()); let (mut fract, mut floor) = (Rational::new(), Integer::new());