Fix bug in Num.sqrt

This commit is contained in:
Ju Liu 2021-03-28 17:19:33 +01:00
parent c48f415058
commit 8ccdeefdf2
2 changed files with 50 additions and 34 deletions

View file

@ -1138,43 +1138,29 @@ fn num_sqrt(symbol: Symbol, var_store: &mut VarStore) -> Def {
branch_var: ret_var, branch_var: ret_var,
cond_var: bool_var, cond_var: bool_var,
branches: vec![( branches: vec![(
// if-condition no_region(RunLowLevel {
no_region( op: LowLevel::NumGte,
// Num.neq denominator 0 args: vec![
RunLowLevel { (float_var, Var(Symbol::ARG_1)),
op: LowLevel::NotEq, (float_var, Float(unbound_zero_var, precision_var, 0.0)),
args: vec![ ],
(float_var, Var(Symbol::ARG_1)), ret_var: bool_var,
(float_var, Float(unbound_zero_var, precision_var, 0.0)), }),
],
ret_var: bool_var,
},
),
// denominator was not zero
no_region(
// Ok (Float.#divUnchecked numerator denominator)
tag(
"Ok",
vec![
// Num.#divUnchecked numerator denominator
RunLowLevel {
op: LowLevel::NumSqrtUnchecked,
args: vec![(float_var, Var(Symbol::ARG_1))],
ret_var: float_var,
},
],
var_store,
),
),
)],
final_else: Box::new(
// denominator was zero
no_region(tag( no_region(tag(
"Err", "Ok",
vec![tag("DivByZero", Vec::new(), var_store)], vec![RunLowLevel {
op: LowLevel::NumSqrtUnchecked,
args: vec![(float_var, Var(Symbol::ARG_1))],
ret_var: float_var,
}],
var_store, var_store,
)), )),
), )],
final_else: Box::new(no_region(tag(
"Err",
vec![tag("SqrtOfNegative", Vec::new(), var_store)],
var_store,
))),
}; };
defn( defn(

View file

@ -375,6 +375,36 @@ mod gen_num {
); );
} }
#[test]
fn f64_sqrt_zero() {
assert_evals_to!(
indoc!(
r#"
when Num.sqrt 0 is
Ok val -> val
Err _ -> -1
"#
),
0.0,
f64
);
}
#[test]
fn f64_sqrt_negative() {
assert_evals_to!(
indoc!(
r#"
when Num.sqrt -1 is
Err _ -> 42
Ok val -> val
"#
),
42.0,
f64
);
}
#[test] #[test]
fn f64_round_old() { fn f64_round_old() {
assert_evals_to!("Num.round 3.6", 4, i64); assert_evals_to!("Num.round 3.6", 4, i64);