diff options
author | wkoszek <wkoszek@FreeBSD.org> | 2006-02-23 20:46:10 +0000 |
---|---|---|
committer | wkoszek <wkoszek@FreeBSD.org> | 2006-02-23 20:46:10 +0000 |
commit | c5c882e144dffffbf4062f6725b10fa9a7c55c1a (patch) | |
tree | e2c424b0825f6726275b21b45f381431eb288eb0 /usr.bin/ministat | |
parent | cacaead301f6371dc869b89b0125ad91aec267be (diff) | |
download | FreeBSD-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 'usr.bin/ministat')
-rw-r--r-- | usr.bin/ministat/ministat.c | 25 |
1 files changed, 18 insertions, 7 deletions
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 |