summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwkoszek <wkoszek@FreeBSD.org>2006-02-23 20:46:10 +0000
committerwkoszek <wkoszek@FreeBSD.org>2006-02-23 20:46:10 +0000
commitc5c882e144dffffbf4062f6725b10fa9a7c55c1a (patch)
treee2c424b0825f6726275b21b45f381431eb288eb0
parentcacaead301f6371dc869b89b0125ad91aec267be (diff)
downloadFreeBSD-src-c5c882e144dffffbf4062f6725b10fa9a7c55c1a.zip
FreeBSD-src-c5c882e144dffffbf4062f6725b10fa9a7c55c1a.tar.gz
Fix the way in which median is calculated. If the data source has even
number of data points, value should be calculated by adding two middle elements and dividing them by 2. Approved by: cognet (mentor)
-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