tbegin implementing randnum - numtools - perform numerical operations on vectors and matrices in unix pipes
 (HTM) git clone git://src.adamsgaard.dk/numtools
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 8c9298b2b8694b8b32fa5c182299a6eab7706ebc
 (DIR) parent 932c3cef20eeebc528abd5e545959f8c04f305a0
 (HTM) Author: Anders Damsgaard <anders@adamsgaard.dk>
       Date:   Tue,  3 May 2022 15:13:40 +0200
       
       begin implementing randnum
       
       Diffstat:
         A randnum.c                           |      71 +++++++++++++++++++++++++++++++
       
       1 file changed, 71 insertions(+), 0 deletions(-)
       ---
 (DIR) diff --git a/randnum.c b/randnum.c
       t@@ -0,0 +1,71 @@
       +#include <stdio.h>
       +#include <stdlib.h>
       +#include <err.h>
       +#include <limits.h>
       +#include <string.h>
       +#include <math.h>
       +
       +#include "arg.h"
       +#include "util.h"
       +
       +char *argv0;
       +
       +static void
       +usage(void)
       +{
       +        errx(1, "usage: %s [-f fmtstr] [-h] [-n num] [-s] "
       +                "val1 [val2 ...]\n", argv0);
       +}
       +
       +int
       +main(int argc, char *argv[])
       +{
       +        int i, ret, n = 1, N;
       +        double val = 0.0, *weights = NULL;
       +        char fmtstr[PATH_MAX] = "%g\n";
       +
       +        if (pledge("stdio", NULL) == -1)
       +                err(2, "pledge");
       +
       +        ARGBEGIN {
       +        case 'f':
       +                ret = snprintf(fmtstr, sizeof(fmtstr), "%s", EARGF(usage()));
       +                if (ret < 0 || (size_t)ret >= sizeof(fmtstr))
       +                        errx(1, "%s: could not write fmtstr", __func__);
       +                break;
       +        case 'h':
       +                usage();
       +                break;
       +        case 'n':
       +                n = atoi(EARGF(usage()));
       +                break;
       +        default:
       +                usage();
       +        } ARGEND;
       +
       +        if (argc < 1)
       +                usage();
       +
       +        N = argc;
       +        if (!(weights = calloc(N, sizeof(double))))
       +                err(1, "calloc");
       +
       +        for (i = 0; i < N; i++) {
       +                weights[i] = atof(argv[i]);
       +                if (weights[i] <= 0.0)
       +                        errx(1, "weight %d is not positive (%g)", i, weights[i]);
       +                if (weights[i] > 1.0)
       +                        errx(1, "weight %d is greater than 1 (%g)", i, weights[i]);
       +        }
       +        val = 0.0;
       +        for (i = 0; i < N; i++)
       +                val += weights[i];
       +        if (fabs(val - 1.0) > 1e-3)
       +                errx(1, "weights do not sum to 1 (%g)", val);
       +
       +
       +
       +        free(weights);
       +
       +        return 0;
       +}