Annotation of researchv10no/cmd/PDP11/fpp/aux/rhftoa1.c, revision 1.1.1.1

1.1       root        1: /* ftoa from portable c library, modified to use faster multiply 
                      2:    up and down. */
                      3: /* mjm: removed printf and _dummy call at end;
                      4:  *     now in separate file, rhprintf.o
                      5:  */
                      6: 
                      7: ftoa (x, str, prec, format)
                      8: float x;
                      9: char *str;
                     10: {
                     11: /* converts a floating point number to an ascii string */
                     12: /* x is stored into str, which should be at least 30 chars long */
                     13: int ie, i, k, ndig, fstyle;
                     14: double y;
                     15: ndig =  ( prec<0) ? 7 : (prec > 22 ? 23 : prec+1);
                     16: if  (format == 'f' || format == 'F')
                     17:  fstyle = 1;
                     18: else
                     19:  fstyle = 0;
                     20: /* print in e format unless last arg is 'f' */
                     21: ie = 0;
                     22: /* if x negative, write minus and reverse */
                     23: if ( x < 0.0)
                     24:   {
                     25:   *str++ = '-';
                     26:   x = -x;
                     27:   }
                     28: 
                     29: /* put x in range 1 <= x < 10 */
                     30: if(x > 0.0) {
                     31:        if(x<1e-32){x=x* 1e33; ie = ie - 33;}
                     32:        if(x<1e-16){x=x* 1e17; ie = ie - 17;}
                     33:        if(x<1e-8){x=x* 1e9; ie = ie - 9;}
                     34:        if(x<1e-4){x=x* 1e5; ie = ie - 5;}
                     35:        if(x<1e-2){x=x* 1e3; ie = ie - 3;}
                     36:        if(x<1e-1){x=x* 1e2; ie = ie - 2;}
                     37:         while(x<1.0){ x=x* 10.; ie = ie - 1;}
                     38:        }
                     39: if(x>=1e32){x=x/1e32; ie = ie + 32;}
                     40: if(x>=1e16){x=x/1e16; ie = ie + 16;}
                     41: if(x>=1e8){x=x/1e8; ie = ie + 8;}
                     42: if(x>=1e4){x=x/1e4; ie = ie + 4;}
                     43: if(x>=1e2){x=x/1e2; ie = ie + 2;}
                     44: while(x>=10.){x=x/10.;ie++;}
                     45: 
                     46: /* in f format, number of digits is related to size */
                     47: if (fstyle) ndig = ndig + ie;
                     48: 
                     49: /* round. x is between 1 and 10 and ndig will be printed to
                     50:    right of decimal point so rounding is ... */
                     51: y = 10.0;
                     52: for (i = 0; i < ndig; i++)
                     53:   y=y/10.0;
                     54: x=x+.5*y;
                     55: if (x >= 10.0) /* repair rounding disasters */
                     56:        {
                     57:        x = 1.0;
                     58:        ie++;
                     59:        if (fstyle) ndig++;
                     60:        }
                     61: /* now loop.  put out a digit (obtain by multiplying by
                     62:   10, truncating, subtracting) until enough digits out */
                     63: /* if fstyle, and leading zeros, they go out special */
                     64: if (fstyle && ie < 0)
                     65:        {
                     66:        *str++ = '0';
                     67:        i = (ndig > 0) ? -1 : (ndig-1);
                     68:        i = i - ie;
                     69:        if (i > 0)
                     70:                {
                     71:                *str++ = '.';
                     72:                while (i--)
                     73:                        *str++ = '0';
                     74:                }
                     75:        }
                     76: for (i=0; i < ndig; i++)
                     77:   {
                     78:   if (i == (fstyle ? ie+1 : 1)) /* where is decimal point */
                     79:     *str++ = '.';
                     80:   k = x;
                     81:   *str++ = k + '0';
                     82:   x = x - (y=k);
                     83:   x=x*10.;
                     84:   }
                     85: 
                     86: /* now, in estyle,  put out exponent if not zero */
                     87: if (!fstyle && ie != 0)
                     88:   {
                     89:   *str++ = 'E';
                     90:   if (ie < 0)
                     91:     {
                     92:     ie = -ie;
                     93:     *str++ = '-';
                     94:     }
                     95:   for (k=100; k > ie; k = k/10);
                     96:   for (; k > 0; k = k/10)
                     97:        {
                     98:        *str++ = ie/k + '0';
                     99:        ie = ie%k;
                    100:        }
                    101:   }
                    102: *str = '\0';
                    103: return;
                    104: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.