diff --git a/crates/engine/src/cmd/table_formula.rs b/crates/engine/src/cmd/table_formula.rs index 165716d68..a68df8198 100644 --- a/crates/engine/src/cmd/table_formula.rs +++ b/crates/engine/src/cmd/table_formula.rs @@ -718,7 +718,10 @@ fn call(name: &str, args: &[Expr], here: &Here) -> Result { } "ABS" => Ok(one(name, args, here)?.abs()), "INT" => Ok(one(name, args, here)?.floor()), - "SIGN" => Ok(one(name, args, here)?.signum()), + "SIGN" => { + let x = one(name, args, here)?; + Ok(if x == 0.0 { 0.0 } else { x.signum() }) + } "ROUND" => match args { [a, b] => { let x = scalar(eval(a, here)?)?; @@ -763,6 +766,16 @@ mod tests { evaluate(t, r, c, f) } + #[test] + fn sign_of_zero_is_zero() { + let t = table(&[&["0", "5", "-5"]]); + assert_eq!(ev(&t, 0, 0, "=SIGN(0)"), Ok(0.0)); + assert_eq!(ev(&t, 0, 0, "=SIGN(-0)"), Ok(0.0)); + assert_eq!(ev(&t, 0, 1, "=SIGN(A1)"), Ok(0.0), "a cell holding 0"); + assert_eq!(ev(&t, 0, 0, "=SIGN(5)"), Ok(1.0)); + assert_eq!(ev(&t, 0, 0, "=SIGN(-5)"), Ok(-1.0)); + } + #[test] fn cell_references_count_from_one_and_from_a() { assert_eq!(cell_ref("A1"), Some((0, 0)));