diff options
author | Peter Mikkelsen <petermikkelsen10@gmail.com> | 2022-01-13 20:33:51 +0000 |
---|---|---|
committer | Peter Mikkelsen <petermikkelsen10@gmail.com> | 2022-01-13 20:33:51 +0000 |
commit | 2d498de6c105e57c32c9048e5901955556ab38bf (patch) | |
tree | 47f1f2b2d0946345a21ea8bad7383282d4102e86 /functions.c | |
parent | 50d6dd8b50958271bf1ff13f99dc21d4cd8431f7 (diff) |
Implement dyadic (integer only) version of + - × ÷ * ⍟
Diffstat (limited to 'functions.c')
-rw-r--r-- | functions.c | 126 |
1 files changed, 120 insertions, 6 deletions
diff --git a/functions.c b/functions.c index bbac1a9..db9fe01 100644 --- a/functions.c +++ b/functions.c @@ -62,12 +62,12 @@ fnmonad monadfunctiondefs[] = { }; fndyad dyadfunctiondefs[] = { - 0, /* + */ - 0, /* - */ - 0, /* × */ - 0, /* ÷ */ - 0, /* * */ - 0, /* ⍟ */ + fnPlus, /* + */ + fnMinus, /* - */ + fnTimes, /* × */ + fnDivide, /* ÷ */ + fnPower, /* * */ + fnLogarithm, /* ⍟ */ 0, /* ⌹ */ 0, /* ○ */ 0, /* ! */ @@ -189,6 +189,120 @@ fnShape(Array *right) /* Dyadic functions */ Array * +fnPlus(Array *left, Array *right) +{ + Array *leftarr; + Array *rightarr; + int rankok = scalarextend(left, right, &leftarr, &rightarr); + if(!rankok){ + print("Ranks don't match lol\n"); + exits(nil); + } + + Array *res = duparray(leftarr); + for(int i = 0; i < leftarr->size; i++) + res->intdata[i] += rightarr->intdata[i]; + freearray(leftarr); + freearray(rightarr); + return res; +} + +Array * +fnMinus(Array *left, Array *right) +{ + Array *leftarr; + Array *rightarr; + int rankok = scalarextend(left, right, &leftarr, &rightarr); + if(!rankok){ + print("Ranks don't match lol\n"); + exits(nil); + } + + Array *res = duparray(leftarr); + for(int i = 0; i < leftarr->size; i++) + res->intdata[i] -= rightarr->intdata[i]; + freearray(leftarr); + freearray(rightarr); + return res; +} + +Array * +fnTimes(Array *left, Array *right) +{ + Array *leftarr; + Array *rightarr; + int rankok = scalarextend(left, right, &leftarr, &rightarr); + if(!rankok){ + print("Ranks don't match lol\n"); + exits(nil); + } + + Array *res = duparray(leftarr); + for(int i = 0; i < leftarr->size; i++) + res->intdata[i] *= rightarr->intdata[i]; + freearray(leftarr); + freearray(rightarr); + return res; +} + +Array * +fnDivide(Array *left, Array *right) +{ + Array *leftarr; + Array *rightarr; + int rankok = scalarextend(left, right, &leftarr, &rightarr); + if(!rankok){ + print("Ranks don't match lol\n"); + exits(nil); + } + + Array *res = duparray(leftarr); + for(int i = 0; i < leftarr->size; i++) + res->intdata[i] /= rightarr->intdata[i]; + freearray(leftarr); + freearray(rightarr); + return res; +} + +Array * +fnPower(Array *left, Array *right) +{ + Array *leftarr; + Array *rightarr; + int rankok = scalarextend(left, right, &leftarr, &rightarr); + if(!rankok){ + print("Ranks don't match lol\n"); + exits(nil); + } + + Array *res = duparray(leftarr); + for(int i = 0; i < leftarr->size; i++) + res->intdata[i] = pow(res->intdata[i], rightarr->intdata[i]); + freearray(leftarr); + freearray(rightarr); + return res; +} + +Array * +fnLogarithm(Array *left, Array *right) +{ + Array *leftarr; + Array *rightarr; + int rankok = scalarextend(left, right, &leftarr, &rightarr); + if(!rankok){ + print("Ranks don't match lol\n"); + exits(nil); + } + + Array *res = duparray(leftarr); + for(int i = 0; i < leftarr->size; i++) + res->intdata[i] = log(rightarr->intdata[i])/log(res->intdata[i]); + freearray(leftarr); + freearray(rightarr); + return res; +} + +Array * fnLeft(Array *left, Array *right) { USED(right); |