svn commit: r209284 - stable/8/usr.bin/jot

Brian Somers brian at FreeBSD.org
Fri Jun 18 07:19:30 UTC 2010


Author: brian
Date: Fri Jun 18 07:19:30 2010
New Revision: 209284
URL: http://svn.freebsd.org/changeset/base/209284

Log:
  MFC r208728 - Fix stuttering sequences and reverse ranges
  
  PR:             123635
  Submitted by:   Ulrich Spörlein, uqs at spoerlein dot net

Modified:
  stable/8/usr.bin/jot/jot.1
  stable/8/usr.bin/jot/jot.c
Directory Properties:
  stable/8/usr.bin/jot/   (props changed)

Modified: stable/8/usr.bin/jot/jot.1
==============================================================================
--- stable/8/usr.bin/jot/jot.1	Fri Jun 18 06:24:40 2010	(r209283)
+++ stable/8/usr.bin/jot/jot.1	Fri Jun 18 07:19:30 2010	(r209284)
@@ -32,7 +32,7 @@
 .\"	@(#)jot.1	8.1 (Berkeley) 6/6/93
 .\" $FreeBSD$
 .\"
-.Dd November 6, 2006
+.Dd June 2, 2010
 .Dt JOT 1
 .Os
 .Sh NAME
@@ -167,6 +167,86 @@ The name
 derives in part from
 .Nm iota ,
 a function in APL.
+.Ss Rounding and truncation
+The
+.Nm
+utility uses double precision floating point arithmetic internally.
+Before printing a number, it is converted depending on the output
+format used.
+.Pp
+If no output format is specified or the output format is a
+floating point format
+.Po
+.Sq E ,
+.Sq G ,
+.Sq e ,
+.Sq f ,
+or
+.Sq g
+.Pc ,
+the value is rounded using the
+.Xr printf 3
+function, taking into account the requested precision.
+.Pp
+If the output format is an integer format
+.Po
+.Sq D ,
+.Sq O ,
+.Sq U ,
+.Sq X ,
+.Sq c ,
+.Sq d ,
+.Sq i ,
+.Sq o ,
+.Sq u ,
+or
+.Sq x
+.Pc ,
+the value is converted to an integer value by truncation.
+.Pp
+As an illustration, consider the following command:
+.Bd -literal -offset indent
+$ jot 6 1 10 0.5
+1
+2
+2
+2
+3
+4
+.Ed
+.Pp
+By requesting an explicit precision of 1, the values generated before rounding
+can be seen.
+The .5 values are rounded down if the integer part is even,
+up otherwise.
+.Bd -literal -offset indent
+$ jot -p 1 6 1 10 0.5
+1.0
+1.5
+2.0
+2.5
+3.0
+3.5
+.Ed
+.Pp
+By offsetting the values slightly, the values generated by the following
+command are always rounded down:
+.Bd -literal -offset indent
+$ jot -p 0 6 .9999999999 10 0.5
+1
+1
+2
+2
+3
+3
+.Ed
+.Pp
+Another way of achieving the same result is to force truncation by
+specifying an integer format:
+.Bd -literal -offset indent
+$ jot -w %d 6 1 10 0.5
+.Ed
+.Pp
 .Sh EXIT STATUS
 .Ex -std
 .Sh EXAMPLES
@@ -201,9 +281,9 @@ the result of
 .Dl jot -w %ds/old/new/ 30 2 - 5
 .Pp
 The stuttering sequence 9, 9, 8, 8, 7, etc.\& can be
-produced by suitable choice of step size,
+produced by truncating the output precision and a suitable choice of step size,
 as in
-.Dl jot - 9 0 -.5
+.Dl jot -w %d - 9.5 0 -.5
 .Pp
 and a file containing exactly 1024 bytes is created with
 .Dl jot -b x 512 > block

Modified: stable/8/usr.bin/jot/jot.c
==============================================================================
--- stable/8/usr.bin/jot/jot.c	Fri Jun 18 06:24:40 2010	(r209283)
+++ stable/8/usr.bin/jot/jot.c	Fri Jun 18 07:19:30 2010	(r209284)
@@ -77,7 +77,7 @@ __FBSDID("$FreeBSD$");
 #define	is_default(s)	(*(s) == 0 || strcmp((s), "-") == 0)
 
 static bool	boring;
-static int	prec;
+static int	prec = -1;
 static bool	longdata;
 static bool	intdata;
 static bool	chardata;
@@ -128,7 +128,7 @@ main(int argc, char **argv)
 			break;
 		case 'p':
 			prec = atoi(optarg);
-			if (prec <= 0)
+			if (prec < 0)
 				errx(1, "bad precision value");
 			have_format = true;
 			break;
@@ -159,7 +159,7 @@ main(int argc, char **argv)
 			if (!sscanf(argv[2], "%lf", &ender))
 				ender = argv[2][strlen(argv[2])-1];
 			mask |= HAVE_ENDER;
-			if (!prec)
+			if (prec < 0)
 				n = getprec(argv[2]);
 		}
 		/* FALLTHROUGH */
@@ -168,7 +168,7 @@ main(int argc, char **argv)
 			if (!sscanf(argv[1], "%lf", &begin))
 				begin = argv[1][strlen(argv[1])-1];
 			mask |= HAVE_BEGIN;
-			if (!prec)
+			if (prec < 0)
 				prec = getprec(argv[1]);
 			if (n > prec)		/* maximum precision */
 				prec = n;
@@ -188,6 +188,10 @@ main(int argc, char **argv)
 		    argv[4]);
 	}
 	getformat();
+
+	if (prec == -1)
+		prec = 0;
+
 	while (mask)	/* 4 bit mask has 1's where last 4 args were given */
 		switch (mask) {	/* fill in the 0's by default or computation */
 		case HAVE_STEP:
@@ -284,13 +288,16 @@ main(int argc, char **argv)
 		if (!have_format && prec == 0 &&
 		    begin >= 0 && begin < divisor &&
 		    ender >= 0 && ender < divisor) {
-			ender += 1;
+			if (begin <= ender)
+				ender += 1;
+			else
+				begin += 1;
 			nosign = true;
 			intdata = true;
 			(void)strlcpy(format,
 			    chardata ? "%c" : "%u", sizeof(format));
 		}
-		x = (ender - begin) * (ender > begin ? 1 : -1);
+		x = ender - begin;
 		for (i = 1; i <= reps || infinity; i++) {
 			if (use_random)
 				y = random() / divisor;


More information about the svn-src-all mailing list