From 6562546771772967350a5c6eaf4e5cd8df53be24 Mon Sep 17 00:00:00 2001 From: James Turner Date: Tue, 16 Nov 2021 10:59:01 +0000 Subject: [PATCH] Nasal Math: add precision to floor(), add trunc() To simplify various rounding / truncation operations, especially when dealing with frequency values, give floor() the same precision control already present in math.round(), and add math.trunc() which always truncates towards zero. --- simgear/nasal/mathlib.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/simgear/nasal/mathlib.c b/simgear/nasal/mathlib.c index cf3ac0f6..6863560e 100644 --- a/simgear/nasal/mathlib.c +++ b/simgear/nasal/mathlib.c @@ -88,7 +88,20 @@ static naRef f_floor(naContext c, naRef me, int argc, naRef* args) naRef a = naNumValue(argc > 0 ? args[0] : naNil()); if(naIsNil(a)) naRuntimeError(c, "non numeric argument to floor()"); - a.num = floor(a.num); + naRef b = naNumValue(argc > 1 ? args[1] : naNil()); + double divisor = naIsNil(b) ? 1.0 : b.num; + a.num = floor(a.num / divisor) * divisor; + return VALIDATE(a); +} + +static naRef f_trunc(naContext c, naRef me, int argc, naRef* args) +{ + naRef a = naNumValue(argc > 0 ? args[0] : naNil()); + if (naIsNil(a)) + naRuntimeError(c, "non numeric argument to trunv()"); + naRef b = naNumValue(argc > 1 ? args[1] : naNil()); + double divisor = naIsNil(b) ? 1.0 : b.num; + a.num = trunc(a.num / divisor) * divisor; return VALIDATE(a); } @@ -221,6 +234,7 @@ static naCFuncItem funcs[] = { { "atan", f_atan }, { "floor", f_floor }, { "ceil", f_ceil }, + { "trunc", f_trunc }, { "fmod", f_fmod }, { "clamp", f_clamp }, { "periodic", f_periodic },