a355fa5e3281b2fc34d1c3460c43701d776c99a2
[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 fprintf (stdout, "stack:");
66 for (i = 0; i < n; i++) {
67 fprintf (stdout, " ");
68 fprintf (stdout, minform, get_tab (stack, i + 1));
69 }
70 fprintf (stdout, "\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 int n = size_tab (stack);
128 if (n < 3) {
129 VERBOSE (WARNING, fprintf (stdout, "error not enough element in stack (%d)\n", n));
130 } else {
131 order_tab (stack);
132 }
133 }
134
135 double median ()
136 {
137 double ret = 0;
138 int n = size_tab (stack);
139 if (n < 3) {
140 VERBOSE (WARNING, fprintf (stdout, "error not enough element in stack (%d)\n", n));
141 } else {
142 tab_t *tmp = copy_tab (stack);
143 order_tab (tmp);
144 ret = get_tab (tmp, (n - 1) / 2 + 1);
145 free_tab (tmp);
146 }
147 return ret;
148 }
149
150 double prod ()
151 {
152 double ret = 1;
153 int i, n = size_tab (stack);
154 if (n < 1) {
155 VERBOSE (WARNING, fprintf (stdout, "error not enough element in stack (%d)\n", n));
156 return 0;
157 }
158 for (i = 0; i < n; i++) {
159 ret *= get_tab (stack, i + 1);
160 }
161 return ret;
162 }
163
164 double sum ()
165 {
166 double ret = 0;
167 int i, n = size_tab (stack);
168 if (n < 1) {
169 VERBOSE (WARNING, fprintf (stdout, "error not enough element in stack (%d)\n", n));
170 return 0;
171 }
172 for (i = 0; i < n; i++) {
173 ret += get_tab (stack, i + 1);
174 }
175 return ret;
176 }
177
178 double variance ()
179 {
180 double ret = 0;
181 int i, n = size_tab (stack);
182 if (n < 2) {
183 VERBOSE (WARNING, fprintf (stdout, "error not enough element in stack (%d)\n", n));
184 return 0;
185 }
186 double m = mean ();
187 for (i = 0; i < n; i++) {
188 double x = get_tab (stack, i + 1);
189 ret += (x - m) * (x - m);
190 }
191 return ret / n;
192 }
193
194 /* vim: set ts=4 sw=4 et: */