error functions
authorLaurent Mazet <mazet@softndesign.org>
Fri, 3 Feb 2023 23:08:54 +0000 (00:08 +0100)
committerLaurent Mazet <mazet@softndesign.org>
Fri, 3 Feb 2023 23:08:54 +0000 (00:08 +0100)
calc.c
parser.c
parser.h

diff --git a/calc.c b/calc.c
index 2e388611c3d5bad387465fab09ed23324653c52b..87e24e6693fb8a1015b0c8b92027a0260ec2a765 100644 (file)
--- a/calc.c
+++ b/calc.c
@@ -293,7 +293,7 @@ int main (int argc, char *argv[])
 // test: echo "-cos (0) + 1" | calc.exe | grep -q '=> -0'
 // test: echo "-cos(0)+1" | calc.exe | grep -q '=> -0'
 // test: echo "quit" | calc.exe | grep -q 'bye'
-// test: echo "help" | calc.exe | grep -q 'misc\.'
+// test: echo "help" | calc.exe | grep -q 'miscellaneous'
 // test: echo "1 + 2 *" | calc.exe | grep -q 'error'
 // test: echo "* 1 - 2" | calc.exe | grep -q 'error'
 // test: echo "2 + * 3" | calc.exe | grep -q 'error'
@@ -380,8 +380,10 @@ int main (int argc, char *argv[])
 // test: echo -e 'sto (3, pi)\nclr\ndisp' | calc.exe | grep -q "storage: 0 0 0 0 0 0 0 0 0 0"
 // test: echo -e 'mem (3)\nclr\nquit' | calc.exe -v 3 | grep -q Clear
 // test: echo -e 'prog (2, 2, {rcl (2) - rcl (1)})\nprog (1, 1, {cos (rcl (1)^2)})\ncall (1, pi/6)\nprog (2, 1, {rcl (1) * 3})\ncall (2, 1, 2)\nls' | calc.exe
-// test: echo -e 'prog (1, 2, {rcl (2) - rcl (1)})\ncall (1, 2, 3)\nls\nedit (1)\nprog (1, 2, {rcl (2) + rcl (1)})\nedit (1)\ndel (1)\nquit' | calc.exe -v 3 |grep -q bye
+// test: echo -e 'prog (1, 2, {rcl (2) - rcl (1)})\ncall (1, 2, 3)\nls\nedit (1)\nprog (1, 2, {rcl (2) + rcl (1)})\nedit (1)\ndel (1)\nquit' | calc.exe -v 3 | grep -q bye
 // test: echo -e 'prog (2, 2, {rcl (2) - rcl (1)})\nprog (3, 1, cos(rcl (1) * pi / 3))\ncall (1, 2, 3)\nls\nedit (1)\ndel (1)\n\ndel (2)\ncall (2, 1, 4)' | calc.exe | grep -c error | xargs test 4 =
+// test: echo -e 'erf (1)\nerfc (1)\nquit' | calc.exe -v 3 | grep -q bye
+// test: echo -e 'erf ()\nerfc ()' | calc.exe | grep -c error | xargs test 2 =
 
 // 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 f88da5d28a7cde05bf79f1526d439e785ec3206a..c94a1e38841ce79e5056394646743ede94c4400a 100644 (file)
--- a/parser.c
+++ b/parser.c
@@ -130,7 +130,7 @@ keyword_t operators[NB_OPERATORS] = {
     { "|",   Or, 2, 1, -2}
 };
 
-#define NB_FUNCTIONS 32
+#define NB_FUNCTIONS 34
 keyword_t functions[NB_FUNCTIONS] = {
     { "sqrt", Sqr, 1, 4, 5},
     { "pow",  Pow, 2, 3, 5},
@@ -143,6 +143,8 @@ keyword_t functions[NB_FUNCTIONS] = {
     { "ln",   Ln, 1, 2, 5},
     { "log",  Log, 1, 3, 5},
     { "exp",  Exp, 1, 3, 5},
+    { "erfc", Erfc, 1, 4, 5},
+    { "erf",  Erf, 1, 3, 5},
     { "abs",  Abs, 1, 3, 5},
     { "floor", Floor, 1, 5, 5},
     { "ceil", Ceil, 1, 4, 5},
@@ -517,6 +519,8 @@ void print_element (element_t *root, int level)
     case Ln: func = "Logarithm (e base)"; break;
     case Log: func = "Logarithm (10 base)"; break;
     case Exp: func = "Exponantial"; break;
+    case Erfc: func = "Complementary Error Function"; break;
+    case Erf: func = "Error Function"; break;
     case Abs: func = "Absolute value"; break;
     case Ceil: func = "Ceil value"; break;
     case Floor: func = "Floor value"; break;
@@ -967,6 +971,8 @@ void help (void)
     fprintf (stdout, " exp ln log pow sqrt\n");
     fprintf (stdout, "trigonometric func.:");
     fprintf (stdout, " acos asin atan cos sin tan\n");
+    fprintf (stdout, "error functions:");
+    fprintf (stdout, " erf erfc\n");
     fprintf (stdout, "miscellaneous func.:");
     fprintf (stdout, " abs ceil floor\n");
     fprintf (stdout, "storage func.:");
@@ -1055,6 +1061,8 @@ double evaluate_element (element_t *root, char mask)
     case Ln:
     case Log:
     case Exp:
+    case Erfc:
+    case Erf:
     case Abs:
     case Ceil:
     case Floor:
@@ -1114,6 +1122,8 @@ double evaluate_element (element_t *root, char mask)
     case Ln: return log (op0);
     case Log: return log10 (op0);
     case Exp: return exp (op0);
+    case Erfc: return erfc (op0);
+    case Erf: return erf (op0);
     case Abs: return fabs (op0);
     case Ceil: return ceil (op0);
     case Floor: return floor (op0);
index dc75776deaef52359a695b7627afe71cfde344da..95ee0e594176d6ef31e02e238a2ca00fb6c83ae6 100644 (file)
--- a/parser.h
+++ b/parser.h
@@ -14,6 +14,7 @@ typedef enum {
     Pow, Sqr,
     Cos, Sin, Tan, Acos, Asin, Atan,
     Ln, Log, Exp,
+    Erfc, Erf,
     Abs, Ceil, Floor,
     Store, Recall, Inc, Dec, Disp, Mem, Clear,
     Quit, Help,