summaryrefslogtreecommitdiffstats
path: root/arith.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2017-02-26 07:33:09 -0800
committerKaz Kylheku <kaz@kylheku.com>2017-02-26 07:33:09 -0800
commita66888b6e07dbfd6b22dcd7fa9e240692c17a039 (patch)
tree251e76409dbe78994bd4eb9ed4ea7237020bd47e /arith.c
parent0f32fe85728e4ee35a25094d99bdf7b3ff1630a7 (diff)
downloadtxr-a66888b6e07dbfd6b22dcd7fa9e240692c17a039.tar.gz
txr-a66888b6e07dbfd6b22dcd7fa9e240692c17a039.tar.bz2
txr-a66888b6e07dbfd6b22dcd7fa9e240692c17a039.zip
New floor-rem, ceil-rem and round-rem.
* arith.c (trunc_rem): Move function to below round function. Make second argument optional, defaulting to one. (floor_rem, ceil_rem, round_rem): New functions. * eval.c (eval_init): Registration of trunc-rem altered for optional argument. New registrations for floor-rem, ceil-rem, round=rem. * txr.1: Documented for new functions folded with trunc-rem.
Diffstat (limited to 'arith.c')
-rw-r--r--arith.c35
1 files changed, 28 insertions, 7 deletions
diff --git a/arith.c b/arith.c
index 483efa15..1dff8eb6 100644
--- a/arith.c
+++ b/arith.c
@@ -1090,13 +1090,6 @@ divzero:
uw_throw(numeric_error_s, lit("mod: division by zero"));
}
-val trunc_rem(val anum, val bnum)
-{
- val quot = trunc(anum, bnum);
- val rem = minus(anum, mul(quot, bnum));
- return list(quot, rem, nao);
-}
-
val floordiv(val anum, val bnum)
{
if (missingp(bnum))
@@ -1312,6 +1305,34 @@ val roundiv(val anum, val bnum)
}
}
+val trunc_rem(val anum, val bnum)
+{
+ val quot = trunc(anum, bnum);
+ val rem = minus(anum, mul(quot, if3(missingp(bnum), one, bnum)));
+ return list(quot, rem, nao);
+}
+
+val floor_rem(val anum, val bnum)
+{
+ val quot = floordiv(anum, bnum);
+ val rem = minus(anum, mul(quot, if3(missingp(bnum), one, bnum)));
+ return list(quot, rem, nao);
+}
+
+val ceil_rem(val anum, val bnum)
+{
+ val quot = ceildiv(anum, bnum);
+ val rem = minus(anum, mul(quot, if3(missingp(bnum), one, bnum)));
+ return list(quot, rem, nao);
+}
+
+val round_rem(val anum, val bnum)
+{
+ val quot = roundiv(anum, bnum);
+ val rem = minus(anum, mul(quot, if3(missingp(bnum), one, bnum)));
+ return list(quot, rem, nao);
+}
+
val wrap_star(val start, val end, val num)
{
val modulus = minus(end, start);