Yours Wilhelm Braunschober
/*!lcc
 * gcc -O3 %* -lgsl
 * a.exe
 * del a.exe
 */
/* gsl_rstat_median has 2 bugs:
 * 1. input vector size 5: result wrong unless sorted
 * 2. input vector size > 5 and even: always wrong
 * */
#include <stdio.h>
#include <gsl/gsl_rstat.h>

int main(void) {
    double d1[] { 1 };
    double d2[] { 2, 1 };
    double d3[] { 2, 3, 1 };
    double d4[] { 2, 4, 1, 3 };
    double d5[] { 3, 2, 5, 1, 4 };
    double d6[] { 3, 5, 1, 2, 4, 6 };
    double d7[] { 4, 5, 7, 1, 2, 6, 3 };
    double d8[] { 4, 6, 2, 1, 8, 3, 7, 5 };
    double* data[8] { d1, d2, d3, d4, d5, d6, d7, d8 };
    for (int i=0; i<8; ++i) {
        gsl_rstat_workspace *rstat_p = gsl_rstat_alloc();
        /* add data to rstat accumulator */
        for (int j = 0; j < i+1; ++j) {
            printf("%g ", data[i][j]);
            gsl_rstat_add(data[i][j], rstat_p);
        }
        double median = gsl_rstat_median(rstat_p);
        double should_be = (i+2.0)/2.0;
        printf(" median %g %s %g\n", median, median == should_be ? "==" : "!=", 
should_be);
    }
}

Reply via email to