Introduction
Introduction Statistics Contact Development Disclaimer Help
trange(1): make start and end values optional parameters - numtools - perform n…
git clone git://src.adamsgaard.dk/numtools
Log
Files
Refs
README
LICENSE
---
commit f5b275d8876246cc06f45727052174755ac0eb17
parent b66c471c38b655c9161c3d3595479fe0e94576dc
Author: Anders Damsgaard <[email protected]>
Date: Mon, 2 May 2022 14:04:15 +0200
range(1): make start and end values optional parameters
Diffstat:
M range.1 | 33 +++++++++++++++++++++++------…
M range.c | 46 +++++++++++++++++++----------…
2 files changed, 53 insertions(+), 26 deletions(-)
---
diff --git a/range.1 b/range.1
t@@ -3,17 +3,21 @@
.Os
.Sh NAME
.Nm range
-.Nd generates an evenly spaced vector over a spacified range
+.Nd generates an evenly spaced vector over a range
.Sh SYNOPSIS
.Nm
.Ar cmd
+.Op Fl b
.Op Fl e
.Op Fl f Ar fmtstr
.Op Fl h
.Op Fl l
.Op Fl n Ar num
-.Ar min_val
+.Op Fl s
+.Oo
+.Op Ar min_val
.Ar max_val
+.Oc
.Sh DESCRIPTION
.Nm
generates floating-point numbers that are by default evenly distributed
t@@ -21,6 +25,12 @@ in the linear, closed interval [
.Ar min_val
,
.Ar max_val ].
+If
+.Ar max_val
+is not specified, it is 1.
+If
+.Ar min_val
+is not specified, it is 0.
.Pp
The options are as follows:
.Bl -tag -width Ds
t@@ -49,7 +59,7 @@ When including a format specifier (%..), only use forms that…
compatible with
.Vt double
types.
-The default format string is '%g'.
+The default format string is '%g\n'.
.It Fl h
Show usage information.
.It Fl l
t@@ -58,11 +68,13 @@ and 10^max_val.
.It Fl n Ar num
Number of values to produce within the specified range.
The default is 10.
+.It Fl s
+Print the spacing between numbers and exit.
.El
.Sh EXAMPLES
-Generate four equally-spaced numbers in the closed range [0;1]:
+Generate four equally-spaced numbers in the closed default range [0;1]:
.Pp
-.Dl $ range -n 4 0 1
+.Dl $ range -n 4
.Dl 0
.Dl 0.33333
.Dl 0.66667
t@@ -72,7 +84,7 @@ Same as the previous example, but with full
.Vt double
precision on a 64-bit system:
.Pp
-.Dl $ range -n 4 -f '%.17g' 0 1
+.Dl $ range -n 4 -f '%.17g\n' 0 1
.Dl 0
.Dl 0.33333333333333331
.Dl 0.66666666666666663
t@@ -86,14 +98,19 @@ Generate four numbers in the range ]0;1[:
.Dl 0.6
.Dl 0.8
.Pp
+Print ten numbers in the interval [1;10] with spaces between values:
+.Pp
+.Dl $ range -f '%g ' 1 10
+.Dl 1 2 3 4 5 6 7 8 9 10
+.Pp
Repeat and modify a string three times:
.Pp
-.Dl $ range -n 3 -f 'The best number is %.0g' 1 3
+.Dl $ range -n 3 -f 'The best number is %.0g\n' 1 3
.Dl The best number is 1
.Dl The best number is 2
.Dl The best number is 3
.Pp
-Generate three numbers evenly distributed in logspace from 10^0 to 10^3:
+Generate three numbers evenly distributed in logspace from 10^0 to 10^2:
.Pp
.Dl $ range -l -n 3 0 2
.Dl 1
diff --git a/range.c b/range.c
t@@ -13,16 +13,17 @@ char *argv0;
static void
usage(void)
{
- errx(1, "usage: %s [-b] [-e] [-f fmtstr] [-h] [-l] [-n num]"
- "min_val max_val\n", argv0);
+ errx(1, "usage: %s [-b] [-e] [-f fmtstr] [-h] [-l] [-n num] [-s]"
+ "[min_val] max_val\n", argv0);
}
int
main(int argc, char *argv[])
{
- int i, ret, n = 10, logrange = 0, openstart = 0, openend = 0;
- double minv, maxv, dx;
- char fmtstr[PATH_MAX] = "%g";
+ int i, ret, n = 10, logrange = 0, openstart = 0, openend = 0,
+ reportdx = 0;
+ double minv = 0.0, maxv = 1.0, dx;
+ char fmtstr[PATH_MAX] = "%g\n";
ARGBEGIN {
case 'b':
t@@ -45,25 +46,34 @@ main(int argc, char *argv[])
case 'n':
n = atoi(EARGF(usage()));
break;
+ case 's':
+ reportdx = 1;
+ break;
default:
usage();
} ARGEND;
- if (argc == 2) {
+ if (argc > 2)
+ usage();
+ else if (argc == 2) {
minv = atof(argv[0]);
maxv = atof(argv[1]);
- dx = (maxv - minv)/(n - 1 + openend + openstart);
- if (minv >= maxv)
- errx(1, "min_val must be smaller than max_val");
- for (i = 0 + openstart; i < n + openstart; i++) {
- if (logrange)
- printf(fmtstr, pow(10, minv + i * dx));
- else
- printf(fmtstr, minv + i * dx);
- putchar('\n');
- }
- } else
- usage();
+ } else if (argc == 1)
+ maxv = atof(argv[0]);
+
+ dx = (maxv - minv)/(n - 1 + openend + openstart);
+ if (reportdx) {
+ printf(fmtstr, dx);
+ return 0;
+ }
+ if (minv >= maxv)
+ errx(1, "min_val must be smaller than max_val");
+ for (i = 0 + openstart; i < n + openstart; i++) {
+ if (logrange)
+ printf(fmtstr, pow(10, minv + i * dx));
+ else
+ printf(fmtstr, minv + i * dx);
+ }
return 0;
}
You are viewing proxied material from mx1.adamsgaard.dk. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.