summaryrefslogtreecommitdiffstats
path: root/tools
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 /tools
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)
Diffstat (limited to 'tools')
-rw-r--r--tools/tools/ministat/ministat.c25
1 files changed, 18 insertions, 7 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
OpenPOWER on IntegriCloud