fix bracket evaluation
[calc.git] / stack.c
1 #include <math.h>
2 #include <stdio.h>
3
4 #include "debug.h"
5 #include "format.h"
6 #include "parser.h"
7 #include "tabular.h"
8
9 #include "stack.h"
10
11 /* global variables */
12
13 tab_t * stack = NULL;
14
15 /* stack management */
16
17 double get (int n)
18 {
19 return get_tab (stack, n);
20 }
21
22 double length ()
23 {
24 return size_tab (stack);
25 }
26
27 double pop ()
28 {
29 return pop_tab (stack, -1);
30 }
31
32 double push (double val)
33 {
34 double ret = NAN;
35 if (stack) {
36 ret = push_tab (stack, -1, val);
37 } else {
38 stack = resize_tab (stack, 1);
39 ret = set_tab (stack, 1, val);
40 }
41 return ret;
42 }
43
44 double put (int n, double val)
45 {
46 if (n > size_tab (stack)) {
47 stack = resize_tab (stack, n);
48 }
49 return set_tab (stack, n, val);
50 }
51
52 double set (int nbops, element_t **ops)
53 {
54 int i;
55 stack = resize_tab (stack, nbops);
56 for (i = 0; i < nbops; i++) {
57 set_tab (stack, i + 1, evaluate_element (ops[i], 0));
58 }
59 return size_tab (stack);
60 }
61
62 void show (void)
63 {
64 int i, n = size_tab (stack);
65 printf ("stack:");
66 for (i = 0; i < n; i++) {
67 printf (" ");
68 printl (get_tab (stack, i + 1));
69 }
70 printf ("\n");
71 }
72
73 /* stack functions */
74
75 double max ()
76 {
77 double ret = 0;
78 int i, n = size_tab (stack);
79 if (n < 1) {
80 VERBOSE (WARNING, fprintf (stdout, "error not enough element in stack (%d)\n", n));
81 return 0;
82 }
83 ret = get_tab (stack, 1);
84 for (i = 1; i < n; i++) {
85 double cur = get_tab (stack, i + 1);
86 if (cur > ret) {
87 ret = cur;
88 }
89 }
90 return ret;
91 }
92
93 double mean ()
94 {
95 double ret = 0;
96 int i, n = size_tab (stack);
97 if (n < 1) {
98 VERBOSE (WARNING, fprintf (stdout, "error not enough element in stack (%d)\n", n));
99 return 0;
100 }
101 for (i = 0; i < n; i++) {
102 ret += get_tab (stack, i + 1);
103 }
104 return ret / n;
105 }
106
107 double min ()
108 {
109 double ret = 0;
110 int i, n = size_tab (stack);
111 if (n < 1) {
112 VERBOSE (WARNING, fprintf (stdout, "error not enough element in stack (%d)\n", n));
113 return 0;
114 }
115 ret = get_tab (stack, 1);
116 for (i = 1; i < n; i++) {
117 double cur = get_tab (stack, i + 1);
118 if (cur < ret) {
119 ret = cur;
120 }
121 }
122 return ret;
123 }
124
125 void order ()
126 {
127 order_tab (stack);
128 }
129
130 double median ()
131 {
132 double ret = 0;
133 int n = size_tab (stack);
134 if (n < 3) {
135 VERBOSE (WARNING, fprintf (stdout, "error not enough element in stack (%d)\n", n));
136 } else {
137 tab_t *tmp = copy_tab (stack);
138 order_tab (tmp);
139 ret = get_tab (tmp, (n - 1) / 2 + 1);
140 free_tab (tmp);
141 }
142 return ret;
143 }
144
145 double prod ()
146 {
147 double ret = 1;
148 int i, n = size_tab (stack);
149 if (n < 1) {
150 VERBOSE (WARNING, fprintf (stdout, "error not enough element in stack (%d)\n", n));
151 return 0;
152 }
153 for (i = 0; i < n; i++) {
154 ret *= get_tab (stack, i + 1);
155 }
156 return ret;
157 }
158
159 double sum ()
160 {
161 double ret = 0;
162 int i, n = size_tab (stack);
163 if (n < 1) {
164 VERBOSE (WARNING, fprintf (stdout, "error not enough element in stack (%d)\n", n));
165 return 0;
166 }
167 for (i = 0; i < n; i++) {
168 ret += get_tab (stack, i + 1);
169 }
170 return ret;
171 }
172
173 double variance ()
174 {
175 double ret = 0;
176 int i, n = size_tab (stack);
177 if (n < 2) {
178 VERBOSE (WARNING, fprintf (stdout, "error not enough element in stack (%d)\n", n));
179 return 0;
180 }
181 double m = mean ();
182 for (i = 0; i < n; i++) {
183 double x = get_tab (stack, i + 1);
184 ret += (x - m) * (x - m);
185 }
186 return ret / n;
187 }
188
189 /* vim: set ts=4 sw=4 et: */