summaryrefslogtreecommitdiff
path: root/functions.c
diff options
context:
space:
mode:
authorPeter Mikkelsen <petermikkelsen10@gmail.com>2022-01-16 00:48:37 +0000
committerPeter Mikkelsen <petermikkelsen10@gmail.com>2022-01-16 00:48:37 +0000
commitde3bbbc0981bde7a02f7f5398ce921e0beb4c174 (patch)
tree88813af01d0d16a19a205f4bd0f07fcc555d5a81 /functions.c
parentf02e90b27e37f91d4409842dd21cd00c999c805d (diff)
Implement floats
Diffstat (limited to 'functions.c')
-rw-r--r--functions.c102
1 files changed, 83 insertions, 19 deletions
diff --git a/functions.c b/functions.c
index 5fa9305..411f90b 100644
--- a/functions.c
+++ b/functions.c
@@ -191,7 +191,7 @@ fnIndexGenerator(Array *right)
vlong n = right->intdata[0];
Array *res = allocarray(AtypeInt, 1, n);
res->shape[0] = n;
- vlong io = globalIO();
+ vlong io = currentsymtab->io;
for(vlong i = 0; i < n; i++)
res->intdata[i] = i + io;
return res;
@@ -239,11 +239,23 @@ fnPlus(Array *left, Array *right)
exits(nil);
}
- Array *res = duparray(leftarr);
- for(int i = 0; i < leftarr->size; i++)
- res->intdata[i] += rightarr->intdata[i];
+ int typeok = commontype(leftarr, rightarr, &left, &right, 0);
+ if(!typeok){
+ print("Types don't match lol\n");
+ exits(nil);
+ }
+
+ Array *res = duparray(left);
+ for(int i = 0; i < left->size; i++){
+ if(res->type == AtypeFloat)
+ res->floatdata[i] += right->floatdata[i];
+ else if(res->type == AtypeInt)
+ res->intdata[i] += right->intdata[i];
+ }
freearray(leftarr);
freearray(rightarr);
+ freearray(left);
+ freearray(right);
return res;
}
@@ -258,11 +270,23 @@ fnMinus(Array *left, Array *right)
exits(nil);
}
- Array *res = duparray(leftarr);
- for(int i = 0; i < leftarr->size; i++)
- res->intdata[i] -= rightarr->intdata[i];
+ int typeok = commontype(leftarr, rightarr, &left, &right, 0);
+ if(!typeok){
+ print("Types don't match lol\n");
+ exits(nil);
+ }
+
+ Array *res = duparray(left);
+ for(int i = 0; i < left->size; i++){
+ if(res->type == AtypeFloat)
+ res->floatdata[i] -= right->floatdata[i];
+ else if(res->type == AtypeInt)
+ res->intdata[i] -= right->intdata[i];
+ }
freearray(leftarr);
freearray(rightarr);
+ freearray(left);
+ freearray(right);
return res;
}
@@ -277,11 +301,23 @@ fnTimes(Array *left, Array *right)
exits(nil);
}
- Array *res = duparray(leftarr);
- for(int i = 0; i < leftarr->size; i++)
- res->intdata[i] *= rightarr->intdata[i];
+ int typeok = commontype(leftarr, rightarr, &left, &right, 0);
+ if(!typeok){
+ print("Types don't match lol\n");
+ exits(nil);
+ }
+
+ Array *res = duparray(left);
+ for(int i = 0; i < left->size; i++){
+ if(res->type == AtypeFloat)
+ res->floatdata[i] *= right->floatdata[i];
+ else if(res->type == AtypeInt)
+ res->intdata[i] *= right->intdata[i];
+ }
freearray(leftarr);
freearray(rightarr);
+ freearray(left);
+ freearray(right);
return res;
}
@@ -296,11 +332,19 @@ fnDivide(Array *left, Array *right)
exits(nil);
}
- Array *res = duparray(leftarr);
- for(int i = 0; i < leftarr->size; i++)
- res->intdata[i] /= rightarr->intdata[i];
+ int typeok = commontype(leftarr, rightarr, &left, &right, 1);
+ if(!typeok){
+ print("Types don't match lol\n");
+ exits(nil);
+ }
+
+ Array *res = duparray(left);
+ for(int i = 0; i < left->size; i++)
+ res->floatdata[i] /= right->floatdata[i];
freearray(leftarr);
freearray(rightarr);
+ freearray(left);
+ freearray(right);
return res;
}
@@ -315,11 +359,23 @@ fnPower(Array *left, Array *right)
exits(nil);
}
- Array *res = duparray(leftarr);
- for(int i = 0; i < leftarr->size; i++)
- res->intdata[i] = pow(res->intdata[i], rightarr->intdata[i]);
+ int typeok = commontype(leftarr, rightarr, &left, &right, 0);
+ if(!typeok){
+ print("Types don't match lol\n");
+ exits(nil);
+ }
+
+ Array *res = duparray(left);
+ for(int i = 0; i < left->size; i++){
+ if(res->type == AtypeFloat)
+ res->floatdata[i] = pow(res->floatdata[i], right->floatdata[i]);
+ else if(res->type == AtypeInt)
+ res->intdata[i] = pow(res->intdata[i], right->intdata[i]);
+ }
freearray(leftarr);
freearray(rightarr);
+ freearray(left);
+ freearray(right);
return res;
}
@@ -334,11 +390,19 @@ fnLogarithm(Array *left, Array *right)
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]);
+ int typeok = commontype(leftarr, rightarr, &left, &right, 1);
+ if(!typeok){
+ print("Types don't match lol\n");
+ exits(nil);
+ }
+
+ Array *res = duparray(left);
+ for(int i = 0; i < left->size; i++)
+ res->floatdata[i] = log(right->floatdata[i])/log(res->floatdata[i]);
freearray(leftarr);
freearray(rightarr);
+ freearray(left);
+ freearray(right);
return res;
}