summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Mikkelsen <petermikkelsen10@gmail.com>2022-01-22 13:45:49 +0000
committerPeter Mikkelsen <petermikkelsen10@gmail.com>2022-01-22 13:45:49 +0000
commitba2c098932896234f17829e54399328cb24ed1be (patch)
treeccae2cbb99a380f9e414e4208daf77aef64a8756
parent26ee5089659da12e3c060edfefd056e2196b4363 (diff)
Implement dyadic | ⌊ and ⌈
-rw-r--r--apl9.h3
-rw-r--r--functions.c32
2 files changed, 32 insertions, 3 deletions
diff --git a/apl9.h b/apl9.h
index d4e054d..94ae192 100644
--- a/apl9.h
+++ b/apl9.h
@@ -255,6 +255,9 @@ Array *fnTimes(Array *, Array *);
Array *fnDivide(Array *, Array *);
Array *fnPower(Array *, Array *);
Array *fnLogarithm(Array *, Array *);
+Array *fnResidue(Array *, Array *);
+Array *fnMaximum(Array *, Array *);
+Array *fnMinimum(Array *, Array *);
Array *fnLeft(Array *, Array *);
Array *fnRight(Array *, Array *);
Array *fnMatch(Array *, Array *);
diff --git a/functions.c b/functions.c
index daff046..43a2505 100644
--- a/functions.c
+++ b/functions.c
@@ -72,9 +72,9 @@ fndyad dyadfunctiondefs[] = {
0, /* ○ */
0, /* ! */
0, /* ? */
- 0, /* | */
- 0, /* ⌈ */
- 0, /* ⌊ */
+ fnResidue, /* | */
+ fnMaximum, /* ⌈ */
+ fnMinimum, /* ⌊ */
0, /* ⊥ */
0, /* ⊤ */
fnLeft, /* ⊣ */
@@ -592,6 +592,32 @@ SCALAR_FUNCTION_2(fnLogarithm, 1,
break;
)
+SCALAR_FUNCTION_2(fnResidue, 1,
+ case AtypeFloat:
+ if(res->floatdata[i] == 0)
+ res->floatdata[i] = right->floatdata[i];
+ else
+ res->floatdata[i] = right->floatdata[i] - res->floatdata[i] * floor(right->floatdata[i]/res->floatdata[i]);
+)
+
+SCALAR_FUNCTION_2(fnMaximum, 0,
+ case AtypeFloat:
+ if(res->floatdata[i] < right->floatdata[i])
+ res->floatdata[i] = right->floatdata[i];
+ case AtypeInt:
+ if(res->intdata[i] < right->intdata[i])
+ res->intdata[i] = right->intdata[i];
+)
+
+SCALAR_FUNCTION_2(fnMinimum, 0,
+ case AtypeFloat:
+ if(res->floatdata[i] > right->floatdata[i])
+ res->floatdata[i] = right->floatdata[i];
+ case AtypeInt:
+ if(res->intdata[i] > right->intdata[i])
+ res->intdata[i] = right->intdata[i];
+)
+
Array *
fnLeft(Array *left, Array *right)
{