add commands deg, grad and rad
authorLaurent Mazet <mazet@softndesign.org>
Tue, 28 Feb 2023 20:37:46 +0000 (21:37 +0100)
committerLaurent Mazet <mazet@softndesign.org>
Tue, 28 Feb 2023 21:56:02 +0000 (22:56 +0100)
calc.c
element.h
parser.c

diff --git a/calc.c b/calc.c
index 0fdea1fbb304ab8ba51f02a21b5f84747b614f61..cbfdcfa26724b2032b3c753caf987a909f67b246 100644 (file)
--- a/calc.c
+++ b/calc.c
@@ -463,6 +463,8 @@ int main (int argc, char *argv[])
 // test: echo -e 'base (-2)\nbase (16, 0)' | calc.exe | grep -c error | xargs test 2 =
 // test: echo -e 'base (10, 16)\n255' | calc.exe | grep -q '=> ff'
 // test: echo -e 'base' | calc.exe | grep -q 'base (I/O): 10/10'
+// test: echo -e 'deg\nacos (-1)\ngrad\nacos (-1)\nrad\nacos (-1)' | calc.exe | awk 'BEGIN { split("180 200 3.14159", v) } /=>/ { for (i in v) if ($2 == v[i]) n++ } END { exit n != 3 }'
+// test: echo -e 'format\nbase\ndeg\ngrad\nrad\nquit' | calc.exe -v 3 | grep -q bye
 
 // Gauss sequence
 // test: echo -e '{sto (1, 0), sto (10, 0), while (inc (10) <= 100, {sto (1, rcl (1) + rcl (10)), print (rcl (1))})};' | calc.exe | grep -q '=> 5050'
index 0fd40f8bcfa218b1d2727af63bcdbf25e4edafb9..37c82136a7e11477b5e513de3619553f1c39f28c 100644 (file)
--- a/element.h
+++ b/element.h
@@ -23,7 +23,7 @@ typedef enum {
     Prog, Arg, Call, List, Edit, Del,
     Get, Length, Pop, Push, Put, Set, Show,
     Max, Mean, Median, Min, Order, Prod, Sum, Variance,
-    Precision, Base
+    Precision, Base, Deg, Grad, Rad
 } func_t;
 
 /* keyword type */
index 0f4e6418e46593fe9afd14ed4fb4b63a09fe3109..24afb116c98f19a4a2d0e2724a4d52b6982984fb 100644 (file)
--- a/parser.c
+++ b/parser.c
@@ -18,6 +18,8 @@
 
 double answer = 0;
 
+double anglefactor = 1;
+
 /* compare codes */
 
 int codecmp (char *ref, char *str)
@@ -62,7 +64,7 @@ keyword_t operators[NB_OPERATORS] = {
     { "|",   Or, 2, 1, -2}
 };
 
-#define NB_FUNCTIONS 52
+#define NB_FUNCTIONS 55
 keyword_t functions[NB_FUNCTIONS] = {
     { "sqrt", Sqr, 1, 4, 5},
     { "pow",  Pow, 2, 3, 5},
@@ -115,7 +117,10 @@ keyword_t functions[NB_FUNCTIONS] = {
     { "sum",  Sum, 0, 3, 5},
     { "var",  Variance, 2, 3, 5},
     { "format", Precision, 1, 6, 9},
-    { "base", Base, 2, 4, 9}
+    { "base", Base, 2, 4, 9},
+    { "deg", Deg, 0, 3, 9},
+    { "grad", Grad, 0, 4, 9},
+    { "rad", Rad, 0, 3, 9}
 };
 
 #define NB_CONSTANTS 3
@@ -523,6 +528,9 @@ void print_element (element_t *root, int level)
     case Variance: func = "Variance"; break;
     case Precision: func = "Precision"; break;
     case Base: func = "Base"; break;
+    case Deg: func = "Degree"; break;
+    case Grad: func = "Gradian"; break;
+    case Rad: func = "Radian"; break;
     }
 
     printf ("Function: %s\n", func);
@@ -618,7 +626,7 @@ void help (void)
     printf ("stack func.:");
     printf (" max mean med min ord prod sum var\n");
     printf ("control management:");
-    printf (" base format help quit\n");
+    printf (" base deg format grad help quit rad\n");
     printf ("constants:");
     printf (" ans e pi\n");
 }
@@ -767,6 +775,9 @@ double evaluate_element (element_t *root, char mask)
     case Order:
     case Prod:
     case Sum:
+    case Deg:
+    case Grad:
+    case Rad:
         break;
     case While:
         if (root->ops[0] == NULL) {
@@ -827,12 +838,12 @@ double evaluate_element (element_t *root, char mask)
     case Mod: return fmod (op0, op1);
     case Pow: return pow (op0, op1);
     case Sqr: return sqrt (op0);
-    case Cos: return cos (op0);
-    case Sin: return sin (op0);
-    case Tan: return tan (op0);
-    case Acos: return acos (op0);
-    case Asin: return asin (op0);
-    case Atan: return atan (op0);
+    case Cos: return cos (op0 / anglefactor);
+    case Sin: return sin (op0 / anglefactor);
+    case Tan: return tan (op0 / anglefactor);
+    case Acos: return acos (op0) * anglefactor;
+    case Asin: return asin (op0) * anglefactor;
+    case Atan: return atan (op0) * anglefactor;
     case Ln: return log (op0);
     case Log: return log10 (op0);
     case Exp: return exp (op0);
@@ -933,6 +944,15 @@ double evaluate_element (element_t *root, char mask)
     case Base:
         base ((int)op0, (int)op1);
         break;
+    case Deg:
+        anglefactor = 180 / M_PI;
+        break;
+    case Grad:
+        anglefactor = 200 / M_PI;
+        break;
+    case Rad:
+        anglefactor = 1;
+        break;
     }
 
     return 0;