|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T s
Length: 2643 (0xa53)
Types: TextFile
Names: »series.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki
└─⟦this⟧ »EUUGD11/stat-5.3/eu/stat/src/series.c«
/* Copyright 1982 Gary Perlman */
#include "stat.h"
PGM(series,Generate an Additive Series of Numbers,5.4,10/24/86)
#define startstr argv[1] /* argv start value */
#define endingstr argv[2] /* argv ending value */
#define stepstr argv[3] /* argv stepsize value */
#define GFORMAT "%g\n" /* print format for real numbers */
#define IFORMAT "%.0f\n" /* print format for integers */
char *Format = GFORMAT; /* print format for numbers in series */
Boole Onlyint; /* use integer format */
double Start; /* series start value */
double Ending; /* series end value (note: end is reserved word */
#define RANGE (Ending-Start) /* just used to make expression clearer */
double Step = 1.0; /* default stepsize - might be negated */
\f
/*FUNCTION main: series */
main (argc, argv) char **argv;
{
long nitems; /* number of items to generate */
long item; /* item number in series */
double value; /* current value in series */
int nargs = argc - 1; /* number of arguments on command line */
ARGV0; /* set up name of program */
/* first check for problems with arguments */
switch (nargs)
{
case 3: /* series start ending stepsize */
if (!number (stepstr))
ERRNUM (stepstr,stepsize) /* always EXITs */
/* FALLTHROUGH */
case 2: /* series start ending */
if (!number (startstr))
ERRNUM (startstr,series start) /* always EXITs */
if (!number (endingstr))
ERRNUM (endingstr,series end) /* always EXITs */
break;
default:
USAGE (start end [stepsize]) /* always EXITs */
}
/* set series values and check for integer values */
Start = atof (startstr);
Ending = atof (endingstr);
Onlyint = isinteger (startstr) && isinteger (endingstr);
if (nargs == 3) /* stepsize supplied on command line */
{
Step = fabs (atof (stepstr));
if (!fzero (RANGE) && fzero (Step)) /* any step okay if RANGE == 0 */
ERRMSG0 (stepsize must be non-zero) /* always EXITs */
Onlyint &= isinteger (stepstr);
}
if (Start > Ending) /* stepsize must be negative */
Step = (-Step);
if (Onlyint) /* use "integer" floating format (%g broken on LATTICE) */
Format = IFORMAT;
if (fzero (RANGE)) /* Start == Ending, so just print one number */
nitems = 1;
else
nitems = RANGE / Step + 1.0 + FZERO; /* RANGE < 0 iff Step < 0 */
/* finally, we print the series, multiplying to avoid rounding */
for (item = 0; item < nitems; item++)
{
value = Start + Step * item;
printf (Format, fzero (value) ? 0.0 : value);
}
exit (SUCCESS);
}