summaryrefslogtreecommitdiffstats
path: root/arith.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2014-10-16 19:01:26 -0700
committerKaz Kylheku <kaz@kylheku.com>2014-10-16 19:01:26 -0700
commit499f04dc4f9f864071d6ff7e75c9cbec60e2fd12 (patch)
treea088c450568622b02c46dbce6cec053861c04569 /arith.c
parentb2dfc50f1c98417166d647538d7d5ecd6178dd4c (diff)
downloadtxr-499f04dc4f9f864071d6ff7e75c9cbec60e2fd12.tar.gz
txr-499f04dc4f9f864071d6ff7e75c9cbec60e2fd12.tar.bz2
txr-499f04dc4f9f864071d6ff7e75c9cbec60e2fd12.zip
* arith.c (gcd): Fix semantics. If either operand is
zero, return the other operand. (lcm): New function. * eval.c (eval_init): Retarget registration of gcd to variable argument gcdv function. Register lcm. * lib.c (gcdv, lcmv): New functions. * lib.h (gcdv, lcm, lcmv): Declared. * txr.1: Re-document gcd with coverage of lcm. * txr.vim: Regenerated.
Diffstat (limited to 'arith.c')
-rw-r--r--arith.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/arith.c b/arith.c
index 76066d63..7699ad11 100644
--- a/arith.c
+++ b/arith.c
@@ -1375,8 +1375,11 @@ val gcd(val anum, val bnum)
if (!integerp(anum) || !integerp(bnum))
goto inval;
- if (zerop(anum))
- return zero;
+ if (anum == zero)
+ return bnum;
+
+ if (bnum == zero)
+ return anum;
if (fixnump(anum))
anum = bignum(c_num(anum));
@@ -1398,6 +1401,17 @@ bad:
anum, bnum, nao);
}
+val lcm(val anum, val bnum)
+{
+ if (anum == zero || bnum == zero) {
+ return zero;
+ } else {
+ val prod = mul(anum, bnum);
+ val gcdv = gcd(anum, bnum);
+ return abso(trunc(prod, gcdv));
+ }
+}
+
val floorf(val num)
{
if (integerp(num))