1*3e12c5d1SDavid du Colombier #include <math.h>
2*3e12c5d1SDavid du Colombier #include <stdlib.h>
3*3e12c5d1SDavid du Colombier double pow10(int);
4*3e12c5d1SDavid du Colombier #define NDIG 18
5*3e12c5d1SDavid du Colombier #define NFTOA (NDIG+4)
6*3e12c5d1SDavid du Colombier /*
7*3e12c5d1SDavid du Colombier * convert floating to ascii. ftoa returns an integer e such that
8*3e12c5d1SDavid du Colombier * f=g*10**e, with .1<=|g|<1 (e=0 when g==0) and puts an ascii
9*3e12c5d1SDavid du Colombier * representation of g in the buffer pointed to by bp. bp[0] will
10*3e12c5d1SDavid du Colombier * be '+' or '-', and bp[1] to bp[NFTOA-2]
11*3e12c5d1SDavid du Colombier * will be appropriate digits of g. bp[NFTOA-1] will be '\0'
12*3e12c5d1SDavid du Colombier */
ftoa(double f,char * bp)13*3e12c5d1SDavid du Colombier int ftoa(double f, char *bp){
14*3e12c5d1SDavid du Colombier int e, e1, e2, i;
15*3e12c5d1SDavid du Colombier double digit, g, p;
16*3e12c5d1SDavid du Colombier if(f>=0) *bp++='+';
17*3e12c5d1SDavid du Colombier else{
18*3e12c5d1SDavid du Colombier f=-f;
19*3e12c5d1SDavid du Colombier *bp++='-';
20*3e12c5d1SDavid du Colombier }
21*3e12c5d1SDavid du Colombier /* find e such that f==0 or 1<=f*pow10(e)<10, and set f=f*pow10(e) */
22*3e12c5d1SDavid du Colombier if(f==0.) e=1;
23*3e12c5d1SDavid du Colombier else{
24*3e12c5d1SDavid du Colombier frexp(f, &e);
25*3e12c5d1SDavid du Colombier e=-e*30103/100000;
26*3e12c5d1SDavid du Colombier /* split in 2 pieces to guard against overflow in extreme cases */
27*3e12c5d1SDavid du Colombier e1=e/2;
28*3e12c5d1SDavid du Colombier e2=e-e1;
29*3e12c5d1SDavid du Colombier p=f*pow10(e2);
30*3e12c5d1SDavid du Colombier while((g=p*pow10(e1))<1.) e1++;
31*3e12c5d1SDavid du Colombier while((g=p*pow10(e1))>=10.) --e1;
32*3e12c5d1SDavid du Colombier e=e1+e2;
33*3e12c5d1SDavid du Colombier f=g;
34*3e12c5d1SDavid du Colombier }
35*3e12c5d1SDavid du Colombier for(i=0;i!=NDIG;i++){
36*3e12c5d1SDavid du Colombier f=modf(f, &digit)*10.;
37*3e12c5d1SDavid du Colombier *bp++=digit+'0';
38*3e12c5d1SDavid du Colombier }
39*3e12c5d1SDavid du Colombier *bp='\0';
40*3e12c5d1SDavid du Colombier return 1-e;
41*3e12c5d1SDavid du Colombier }
42