_doprint-less ftoa
Istvan Mohos
istvan at hhb.UUCP
Sat Dec 30 01:39:29 AEST 1989
In the absence of elegant solutions to the _doprint-less ftoa problem
posed by Marcus J. Ranum, here is a highly tedious one: convert the float
into two ulongs (one for the whole-number part and one for the fraction),
and break each one down to decimal digits.
As Simon & Garfunkel once said about floating point precision:
"...any way you look at it, you loose."
-------------------------------CUT HERE--------------------------------
/* ftoa the hard way --- Istvan Mohos, 1989 --- in the Public Domain */
/* compile with: /bin/cc ftoa.c -lm -o ftoa */
/* assuming 32-bit longs */
#include <math.h>
#include <stdio.h>
/* bare-bones main just for testing --- no error checking */
main (argc, argv)
int argc;
char *argv[];
{
char *ftoa();
char str[512];
while (gets (str) != NULL)
puts (ftoa (atof (str)));
exit (0);
}
char *
ftoa (fl)
float fl;
{
static char buf[512];
static long magtab[] =
{0,1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000};
float absfl = fabs (fl);
char *ptr = buf;
unsigned long ens; /* "ones", "tens", "hundreds", etc. */
unsigned long whole, fraction;
int mag; /* magnitude */
/* overflow error */
if (absfl > 4294967296.) {
*ptr = 0;
return (buf);
}
/* break abs float into two ulongs; max fraction size may approach 1 bil */
whole = ((unsigned long) absfl);
fraction = (unsigned long)((absfl - whole) * 1000000000.);
#ifdef DEBUG
printf ("whole:%ld, fraction:%ld\n", whole, fraction);
#endif
/* negative? */
if (fl < 0.)
*ptr++ = '-';
/* print whole, beginning at most significant decimal digit */
if (whole == 0L)
*ptr++ = '0';
else {
for (mag = 2; mag < 11; mag++) {
if (magtab[mag] > whole)
break;
}
for (; --mag; whole -= ens * magtab[mag]) {
ens = whole / magtab[mag];
*ptr++ = ens + '0';
}
}
*ptr++ = '.';
/* print fraction, retaining leading zeros */
for (mag = 10; --mag; fraction -= ens * magtab[mag]) {
ens = fraction / magtab[mag];
*ptr++ = ens + '0';
}
/* blank trailing zeros */
while (*--ptr == '0');
*++ptr = 0;
return (buf);
}
-------------------------------CUT HERE--------------------------------
--
Istvan Mohos
...uunet!pyrdc!pyrnj!hhb!istvan
HHB Systems 1000 Wyckoff Ave. Mahwah NJ 07430 201-848-8000
====================================================================
More information about the Alt.sources
mailing list