stddev.c (1582B)
1 #include <err.h> 2 #include <stdio.h> 3 #include <stdlib.h> 4 #include <unistd.h> 5 #include <math.h> 6 #include <limits.h> 7 #include <unistd.h> 8 9 #include "util.h" 10 11 static void 12 usage(void) 13 { 14 errx(1, "usage: stddev [-d delimstr] [-n] [-p prec] [-u]"); 15 } 16 17 int 18 main(int argc, char *argv[]) 19 { 20 int ch, prec = 17, finalnl = 1; 21 size_t i, j, nf = 0, nr = 0, correction = 1; 22 double *means = NULL, *stdvals = NULL, **vals = NULL; 23 const char *errstr; 24 char *delimstr = "\t"; 25 26 if (pledge("stdio", NULL) == -1) 27 err(2, "pledge"); 28 29 while ((ch = getopt(argc, argv, "d:np:u")) != -1) { 30 switch (ch) { 31 case 'd': 32 delimstr = optarg; 33 break; 34 case 'n': 35 finalnl = 0; 36 break; 37 case 'p': 38 prec = strtonum(optarg, -10, INT_MAX, &errstr); 39 if (errstr != NULL) 40 errx(1, "bad precision value, %s: %s", errstr, optarg); 41 break; 42 case 'u': 43 correction = 0; 44 break; 45 default: 46 usage(); 47 } 48 } 49 /*argc -= optind;*/ 50 /*argv += optind;*/ 51 52 nr = fscanmatrix(stdin, &vals, &nf); 53 54 if (!(means = calloc(nf, sizeof(double))) || 55 !(stdvals = calloc(nf, sizeof(double)))) 56 err(1, "calloc"); 57 58 for (i = 0; i < nf; i++) { 59 means[i] = 0.0; 60 for (j = 0; j < nr; j++) 61 means[i] += vals[j][i]; 62 means[i] /= (double)nr; 63 } 64 65 for (i = 0; i < nf; i++) { 66 stdvals[i] = 0.0; 67 for (j = 0; j < nr; j++) 68 stdvals[i] += pow(vals[j][i] - means[i], 2.0); 69 stdvals[i] = sqrt(stdvals[i] / ((double)(nr - correction))); 70 } 71 72 printfarr(delimstr, prec, stdvals, nf); 73 if (finalnl) 74 putchar('\n'); 75 76 free(means); 77 free(stdvals); 78 for (i = 0; i < nr; i++) 79 free(vals[i]); 80 free(vals); 81 82 return 0; 83 }