piet@cs.ruu.nl (Piet van Oostrum) (07/11/89)
The Atari GCC compiler does not properly deal with floating point numbers
with exponents (like 1E10). This is becuase the standard library's atof
does not like them. I just put it in there. Here is the new routine:
/* jrd's kludgy atof */
/* It is much less kludgy now -- Piet van Oostrum (piet@cs.ruu.nl) */
/* July 11, 1989 */
#include <ctype.h>
#define maybe_negate(num,flg) ((flg) ? -(num) : (num))
double atof(str)
char * str;
{
int neg = 0;
double accum, factor, ten = 10.0;
char c;
while (isspace(*str)) str++;
if (*str == '-')
{
neg = 1;
str++;
}
else if (*str == '+') str++;
accum = 0;
for ( ; ((c = *str++) && (isdigit(c))) ; )
{
accum = accum * ten + (c - '0');
}
if (c == '.')
{
double tenth = 0.1;
factor = tenth;
for ( ; ((c = *str++) && (isdigit(c))) ; )
{
accum = accum + ((c - '0') * factor);
factor = factor * tenth;
}
}
if (c == 'e' || c == 'E')
{
register int negexp = 0, exp = 0;
while (isspace(*str)) str++ ;
if (*str == '-')
{
negexp = 1;
str++;
}
else if (*str == '+') str++;
for ( ; ((c = *str++) && (isdigit(c))) ; )
{
exp = exp * 10 + c - '0';
}
factor = 1.0;
for ( ; exp >= 10; exp -= 10)
factor *= 10000000000.0;
for ( ; exp > 0; exp--)
factor *= ten;
if (negexp)
accum /= factor;
else
accum *= factor;
}
return(maybe_negate(accum,neg));
}
--
Piet van Oostrum, Dept of Computer Science, University of Utrecht
Padualaan 14, P.O. Box 80.089, 3508 TB Utrecht, The Netherlands
Telephone: +31-30-531806. piet@cs.ruu.nl (mcvax!hp4nl!ruuinf!piet)