Annotation of researchv10no/cmd/PDP11/fpp/aux/rhftoa1.c, revision 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.