www.pudn.com > iccavr_lib.rar > ftoa.c, change:2003-09-11,size:1502b


#include <stdlib.h>

typedef union {
    long	L;
    float	F;
}		LF_t;

char *ftoa(float f, int *status)
	{
	long mantissa, int_part, frac_part;
	short exp2;
	LF_t x;
	char *p;
	static char outbuf[15];

	if (f == 0.0)
		{
		outbuf[0] = '0';
		outbuf[1] = '.';
		outbuf[2] = '0';
		outbuf[3] = 0;
		return outbuf;
		}
	x.F = f;

    exp2 = (unsigned char)(x.L >> 23) - 127;
    mantissa = (x.L & 0xFFFFFF) | 0x800000;
    frac_part = 0;
    int_part = 0;

    if (exp2 >= 31)
		{
		*status = _FTOA_TOO_LARGE;
		return 0;
		}
	else if (exp2 < -23)
		{
		*status = _FTOA_TOO_SMALL;
		return 0;
		}
    else if (exp2 >= 23)
      	int_part = mantissa << (exp2 - 23);
    else if (exp2 >= 0) 
		{
      	int_part = mantissa >> (23 - exp2);
      	frac_part = (mantissa << (exp2 + 1)) & 0xFFFFFF;
		}
    else /* if (exp2 < 0) */
      	frac_part = (mantissa  & 0xFFFFFF) >> -(exp2 + 1);

	p = outbuf;

	if (x.L < 0)
		*p++ = '-';

	if (int_part == 0)
		*p++ = '0';
	else
		{
		ltoa(p, int_part, 10);
		while (*p)
			p++;
		}
	*p++ = '.';

	if (frac_part == 0)
		*p++ = '0';
	else
		{
		char m, max;

		max = sizeof (outbuf) - (p - outbuf) - 1;
		if (max > 7)
			max = 7;
		/* print BCD */
		for (m = 0; m < max; m++)
			{
			/* frac_part *= 10;	*/
			frac_part = (frac_part << 3) + (frac_part << 1);    

			*p++ = (frac_part >> 24) + '0';
			frac_part &= 0xFFFFFF;
			}
		/* delete ending zeroes */
		for (--p; p[0] == '0' && p[-1] != '.'; --p)
			;
		++p;
		}
	*p = 0;

	*status = 0;
	return outbuf;
  	}