13 |
|
#include <math.h> |
14 |
|
#include "platform.h" |
15 |
|
|
16 |
< |
#define MAXCOL 256 /* maximum number of columns */ |
16 |
> |
#define MAXCOL 8192 /* maximum number of columns */ |
17 |
|
|
18 |
|
#define ADD 0 /* add numbers */ |
19 |
|
#define MULT 1 /* multiply numbers */ |
226 |
|
{ |
227 |
|
double inpval[MAXCOL]; |
228 |
|
double tally[MAXCOL]; |
229 |
+ |
short rsign[MAXCOL]; |
230 |
|
double result[MAXCOL]; |
231 |
< |
register int n; |
231 |
> |
int n; |
232 |
|
int nread, ncol; |
233 |
|
long nlin, ltotal; |
234 |
|
FILE *fp; |
241 |
|
} |
242 |
|
if (nbicols) |
243 |
|
SET_FILE_BINARY(fp); |
244 |
+ |
#ifdef getc_unlocked /* avoid lock/unlock overhead */ |
245 |
+ |
flockfile(fp); |
246 |
+ |
#endif |
247 |
+ |
|
248 |
|
ltotal = 0; |
249 |
|
while (!feof(fp)) { |
250 |
|
if (ltotal == 0) { /* initialize */ |
251 |
|
if (func == MULT) /* special case */ |
252 |
< |
for (n = 0; n < MAXCOL; n++) |
252 |
> |
for (n = 0; n < MAXCOL; n++) { |
253 |
|
tally[n] = 0.0; |
254 |
+ |
rsign[n] = 1; |
255 |
+ |
} |
256 |
|
else |
257 |
|
for (n = 0; n < MAXCOL; n++) |
258 |
|
tally[n] = init_val[func]; |
274 |
|
break; |
275 |
|
case MULT: |
276 |
|
if (inpval[n] == 0.0) |
277 |
< |
break; |
278 |
< |
tally[n] += log(fabs(inpval[n])); |
277 |
> |
rsign[n] = 0; |
278 |
> |
else if (inpval[n] < 0.0) { |
279 |
> |
rsign[n] = -rsign[n]; |
280 |
> |
inpval[n] = -inpval[n]; |
281 |
> |
} |
282 |
> |
if (rsign[n]) |
283 |
> |
tally[n] += log(inpval[n]); |
284 |
|
break; |
285 |
|
case MAX: |
286 |
|
if (inpval[n] > tally[n]) |
306 |
|
result[n] = pow(result[n], 1.0/power); |
307 |
|
} |
308 |
|
if (func == MULT) |
309 |
< |
result[n] = exp(tally[n]); |
309 |
> |
result[n] = rsign[n] * exp(result[n]); |
310 |
|
} |
311 |
|
putrecord(result, ncol, stdout); |
312 |
|
if (!subtotal) |