|
|
researchv10 Norman
/* ftoa from portable c library, modified to use faster multiply
up and down. */
ftoa (x, str, prec, format)
float x;
char *str;
{
/* converts a floating point number to an ascii string */
/* x is stored into str, which should be at least 30 chars long */
int ie, i, k, ndig, fstyle;
double y;
ndig = ( prec<0) ? 7 : (prec > 22 ? 23 : prec+1);
if (format == 'f' || format == 'F')
fstyle = 1;
else
fstyle = 0;
/* print in e format unless last arg is 'f' */
ie = 0;
/* if x negative, write minus and reverse */
if ( x < 0.0)
{
*str++ = '-';
x = -x;
}
/* put x in range 1 <= x < 10 */
if(x > 0.0) {
if(x<1e-32){
x=x* 1e33;
ie -= 33;
}
if(x<1e-16){
x=x* 1e17;
ie -= 17;
}
if(x<1e-8){
x=x* 1e9;
ie -= 9;
}
if(x<1e-4){
x=x* 1e5;
ie -= 5;
}
if(x<1e-2){
x=x* 1e3;
ie -= 3;
}
if(x<1e-1){
x=x* 1e2;
ie -= 2;
}
while(x<1.0){
x=x* 10.;
ie -= 1;
}
}
if(x>=1e32){
x=x/1e32;
ie += 32;
}
if(x>=1e16){
x=x/1e16;
ie += 16;
}
if(x>=1e8){
x=x/1e8;
ie += 8;
}
if(x>=1e4){
x=x/1e4;
ie += 4;
}
if(x>=1e2){
x=x/1e2;
ie += 2;
}
while(x>=10.){
x=x/10.;
ie++;
}
/* in f format, number of digits is related to size */
if (fstyle) ndig += ie;
/* round. x is between 1 and 10 and ndig will be printed to
right of decimal point so rounding is ... */
y = 10.0;
for (i = 0; i < ndig; i++)
y=y/10.0;
x=x+.5*y;
if (x >= 10.0) /* repair rounding disasters */
{
x = 1.0;
ie++;
if (fstyle) ndig++;
}
/* now loop. put out a digit (obtain by multiplying by
10, truncating, subtracting) until enough digits out */
/* if fstyle, and leading zeros, they go out special */
if (fstyle && ie < 0)
{
*str++ = '0';
i = (ndig > 0) ? -1 : (ndig-1);
i -= ie;
if (i > 0)
{
*str++ = '.';
while (i--)
*str++ = '0';
}
}
for (i=0; i < ndig; i++)
{
if (i == (fstyle ? ie+1 : 1)) /* where is decimal point */
*str++ = '.';
k = x;
*str++ = k + '0';
x -= (y=k);
x=x*10.;
}
/* now, in estyle, put out exponent if not zero */
if (!fstyle && ie != 0)
{
*str++ = 'E';
if (ie < 0)
{
ie = -ie;
*str++ = '-';
}
for (k=100; k > ie; k /=10);
for (; k > 0; k /=10)
{
*str++ = ie/k + '0';
ie = ie%k;
}
}
*str = '\0';
return;
}
/* printf here to force loading of pfloat is printf is called. */
printf(arg0)
char *arg0;
{
extern int putchar();
return(format(putchar,"%r",&arg0));
}
__dummy() {
extern pfloat(); /* force pfloat and pscien to be loaded */
pfloat();
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.