summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tools/tools/ministat/ministat.c25
-rw-r--r--usr.bin/ministat/ministat.c25
2 files changed, 36 insertions, 14 deletions
diff --git a/tools/tools/ministat/ministat.c b/tools/tools/ministat/ministat.c
index 038ef6b..af3f803 100644
--- a/tools/tools/ministat/ministat.c
+++ b/tools/tools/ministat/ministat.c
@@ -202,15 +202,26 @@ Avg(struct dataset *ds)
static double
Median(struct dataset *ds)
{
- int i;
- struct point *pp;
+ int even, i;
+ struct point *p1, *p2;
- i = ds->n / 2;
- TAILQ_FOREACH(pp, &ds->list, list) {
- if (i--)
- continue;
- return (pp->val);
+ if ((ds->n % 2) == 1) {
+ i = (ds->n / 2) + 1;
+ even = 0;
+ } else {
+ i = ds->n / 2;
+ even = 1;
+ }
+ TAILQ_FOREACH(p1, &ds->list, list) {
+ --i;
+ if (i == 0)
+ break;
+ }
+ if (even) {
+ p2 = TAILQ_NEXT(p1, list);
+ return ((p2->val + p1->val) / 2);
}
+ return (p1->val);
}
static double
diff --git a/usr.bin/ministat/ministat.c b/usr.bin/ministat/ministat.c
index 038ef6b..af3f803 100644
--- a/usr.bin/ministat/ministat.c
+++ b/usr.bin/ministat/ministat.c
@@ -202,15 +202,26 @@ Avg(struct dataset *ds)
static double
Median(struct dataset *ds)
{
- int i;
- struct point *pp;
+ int even, i;
+ struct point *p1, *p2;
- i = ds->n / 2;
- TAILQ_FOREACH(pp, &ds->list, list) {
- if (i--)
- continue;
- return (pp->val);
+ if ((ds->n % 2) == 1) {
+ i = (ds->n / 2) + 1;
+ even = 0;
+ } else {
+ i = ds->n / 2;
+ even = 1;
+ }
+ TAILQ_FOREACH(p1, &ds->list, list) {
+ --i;
+ if (i == 0)
+ break;
+ }
+ if (even) {
+ p2 = TAILQ_NEXT(p1, list);
+ return ((p2->val + p1->val) / 2);
}
+ return (p1->val);
}
static double
OpenPOWER on IntegriCloud