/*Copyright (C) 1992, 1994 by Thomas Glen Smith. All Rights Reserved.*/
/* places APL2 V1.0.0 **************************************************
* Called by precisn. Returns the allowable number of places to the *
* right of the decimal point. If there are any digits left of the *
* decimal point, the sum of the digits left and right of the decimal *
* point cannot exceed 8. Otherwise, the maximum places to the right *
* of the decimal point cannot exceed 9. *
***********************************************************************/
#define INCLUDES MATH
#include "includes.h"
int places(val,digs,maxw)
double val; /* Value to be evaluated. */
int digs; /* Digits left of d.p. in val. */
int maxw; /* Maximum width for digits left and right of decimal */
/* point and decimal point, if needed. */
{
extern double fuzz;
double fraction;
long lw;
int iw,kw;
if (digs >= maxw) return(0); /* No places right of d.p. */
fraction = (val < 0.0) ? -val : val; /* absolute value */
fraction -= floor(fraction); /* Fraction is non-integer part. */
/* For e.g. val=1.1415926733, fraction=.1415926733. */
/* For e.g. val=1.0000000345, fraction=.0000000343 */
if ((1.0 - fraction) < fuzz) return(0); /* Smaller than fuzz. */
kw = maxw - digs;
if (digs) kw--; /* Maximum allowable places right of d.p. */
for (iw = kw; iw > 0; iw--)
fraction *= 10.0;
/* kw digits for kw possible places. Say kw==9: */
/* Then if val=1.1415926733, fraction=141592673.3. */
/* Then if val=1.0000000343, fraction=34.3. */
lw = .1 + fraction; /* lw==123000000 for .123. */
/* For e.g. val=1.1415926733, lw=141592673. */
/* For e.g. val=1.0000000343, lw=34. */
/* lw will contain up to 9 significant digits, 1 for */
/* each significant place to right of d.p. */
if (lw == 0l) return(0); /* Report it as an integer. */
while(lw % 10l == 0) { /* This loop wil change lw from e.g. */
lw /= 10l; /* 123000000 to 123, reducing kw a */
kw--; /* corresponding amount (6). */
}
return(kw);
}