From owner-svn-src-stable-8@FreeBSD.ORG Fri Jun 18 07:19:30 2010 Return-Path: Delivered-To: svn-src-stable-8@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id A64251065670; Fri, 18 Jun 2010 07:19:30 +0000 (UTC) (envelope-from brian@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 94BA08FC1A; Fri, 18 Jun 2010 07:19:30 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o5I7JUov086061; Fri, 18 Jun 2010 07:19:30 GMT (envelope-from brian@svn.freebsd.org) Received: (from brian@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o5I7JU1h086058; Fri, 18 Jun 2010 07:19:30 GMT (envelope-from brian@svn.freebsd.org) Message-Id: <201006180719.o5I7JU1h086058@svn.freebsd.org> From: Brian Somers Date: Fri, 18 Jun 2010 07:19:30 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org X-SVN-Group: stable-8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r209284 - stable/8/usr.bin/jot X-BeenThere: svn-src-stable-8@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for only the 8-stable src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 18 Jun 2010 07:19:30 -0000 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;