missing end of line
[calc.git] / stack.c
... / ...
CommitLineData
1#include <stdio.h>
2
3#include "debug.h"
4#include "format.h"
5#include "parser.h"
6#include "tabular.h"
7
8#include "stack.h"
9
10/* global variables */
11
12tab_t * stack = NULL;
13
14/* stack management */
15
16double get (int n)
17{
18 return get_tab (stack, n);
19}
20
21double length ()
22{
23 return size_tab (stack);
24}
25
26double pop ()
27{
28 return pop_tab (stack, -1);
29}
30
31double push (double val)
32{
33 return push_tab (stack, -1, val);
34}
35
36double put (int n, double val)
37{
38 if (n > size_tab (stack)) {
39 stack = resize_tab (stack, n);
40 }
41 return set_tab (stack, n, val);
42}
43
44double set (int nbops, element_t **ops)
45{
46 int i;
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);
52}
53
54void show (void)
55{
56 int i, n = size_tab (stack);
57 fprintf (stdout, "stack:");
58 for (i = 0; i < n; i++) {
59 fprintf (stdout, " ");
60 fprintf (stdout, minform, get_tab (stack, i + 1));
61 }
62 fprintf (stdout, "\n");
63}
64
65/* stack functions */
66
67double max ()
68{
69 double ret = 0;
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));
73 return 0;
74 }
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;
80 }
81 }
82 return ret;
83}
84
85double mean ()
86{
87 double ret = 0;
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));
91 return 0;
92 }
93 for (i = 0; i < n; i++) {
94 ret += get_tab (stack, i + 1);
95 }
96 return ret / n;
97}
98
99double min ()
100{
101 double ret = 0;
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));
105 return 0;
106 }
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;
112 }
113 }
114 return ret;
115}
116
117void order ()
118{
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);
124 }
125}
126
127double median ()
128{
129 double ret = 0;
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);
138 }
139 return ret;
140}
141
142double prod ()
143{
144 double ret = 1;
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));
148 return 0;
149 }
150 for (i = 0; i < n; i++) {
151 ret *= get_tab (stack, i + 1);
152 }
153 return ret;
154}
155
156double sum ()
157{
158 double ret = 0;
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));
162 return 0;
163 }
164 for (i = 0; i < n; i++) {
165 ret += get_tab (stack, i + 1);
166 }
167 return ret;
168}
169
170double variance ()
171{
172 double ret = 0;
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));
176 return 0;
177 }
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);
182 }
183 return ret / n;
184}
185
186/* vim: set ts=4 sw=4 et: */