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