Annotation of researchv10no/cmd/PDP11/fpp/aux/rhftoa.c, revision 1.1

1.1     ! root        1: /* ftoa from portable c library, modified to use faster multiply 
        !             2:    up and down. */
        !             3: 
        !             4: ftoa (x, str, prec, format)
        !             5: float x;
        !             6: char *str;
        !             7: {
        !             8:        /* converts a floating point number to an ascii string */
        !             9:        /* x is stored into str, which should be at least 30 chars long */
        !            10:        int ie, i, k, ndig, fstyle;
        !            11:        double y;
        !            12:        ndig =  ( prec<0) ? 7 : (prec > 22 ? 23 : prec+1);
        !            13:        if  (format == 'f' || format == 'F')
        !            14:                fstyle = 1;
        !            15:        else
        !            16:                fstyle = 0;
        !            17:        /* print in e format unless last arg is 'f' */
        !            18:        ie = 0;
        !            19:        /* if x negative, write minus and reverse */
        !            20:        if ( x < 0.0)
        !            21:        {
        !            22:                *str++ = '-';
        !            23:                x = -x;
        !            24:        }
        !            25: 
        !            26:        /* put x in range 1 <= x < 10 */
        !            27:        if(x > 0.0) {
        !            28:                if(x<1e-32){
        !            29:                        x=x* 1e33; 
        !            30:                        ie -= 33;
        !            31:                }
        !            32:                if(x<1e-16){
        !            33:                        x=x* 1e17; 
        !            34:                        ie -= 17;
        !            35:                }
        !            36:                if(x<1e-8){
        !            37:                        x=x* 1e9; 
        !            38:                        ie -= 9;
        !            39:                }
        !            40:                if(x<1e-4){
        !            41:                        x=x* 1e5; 
        !            42:                        ie -= 5;
        !            43:                }
        !            44:                if(x<1e-2){
        !            45:                        x=x* 1e3; 
        !            46:                        ie -= 3;
        !            47:                }
        !            48:                if(x<1e-1){
        !            49:                        x=x* 1e2; 
        !            50:                        ie -= 2;
        !            51:                }
        !            52:                while(x<1.0){ 
        !            53:                        x=x* 10.; 
        !            54:                        ie -= 1;
        !            55:                }
        !            56:        }
        !            57:        if(x>=1e32){
        !            58:                x=x/1e32; 
        !            59:                ie += 32;
        !            60:        }
        !            61:        if(x>=1e16){
        !            62:                x=x/1e16; 
        !            63:                ie += 16;
        !            64:        }
        !            65:        if(x>=1e8){
        !            66:                x=x/1e8; 
        !            67:                ie += 8;
        !            68:        }
        !            69:        if(x>=1e4){
        !            70:                x=x/1e4; 
        !            71:                ie += 4;
        !            72:        }
        !            73:        if(x>=1e2){
        !            74:                x=x/1e2; 
        !            75:                ie += 2;
        !            76:        }
        !            77:        while(x>=10.){
        !            78:                x=x/10.;
        !            79:                ie++;
        !            80:        }
        !            81: 
        !            82:        /* in f format, number of digits is related to size */
        !            83:        if (fstyle) ndig += ie;
        !            84: 
        !            85:        /* round. x is between 1 and 10 and ndig will be printed to
        !            86:           right of decimal point so rounding is ... */
        !            87:        y = 10.0;
        !            88:        for (i = 0; i < ndig; i++)
        !            89:                y=y/10.0;
        !            90:        x=x+.5*y;
        !            91:        if (x >= 10.0) /* repair rounding disasters */
        !            92:        {
        !            93:                x = 1.0;
        !            94:                ie++;
        !            95:                if (fstyle) ndig++;
        !            96:        }
        !            97:        /* now loop.  put out a digit (obtain by multiplying by
        !            98:          10, truncating, subtracting) until enough digits out */
        !            99:        /* if fstyle, and leading zeros, they go out special */
        !           100:        if (fstyle && ie < 0)
        !           101:        {
        !           102:                *str++ = '0';
        !           103:                i = (ndig > 0) ? -1 : (ndig-1);
        !           104:                i -= ie;
        !           105:                if (i > 0)
        !           106:                {
        !           107:                        *str++ = '.';
        !           108:                        while (i--)
        !           109:                                *str++ = '0';
        !           110:                }
        !           111:        }
        !           112:        for (i=0; i < ndig; i++)
        !           113:        {
        !           114:                if (i == (fstyle ? ie+1 : 1)) /* where is decimal point */
        !           115:                        *str++ = '.';
        !           116:                k = x;
        !           117:                *str++ = k + '0';
        !           118:                x -= (y=k);
        !           119:                x=x*10.;
        !           120:        }
        !           121: 
        !           122:        /* now, in estyle,  put out exponent if not zero */
        !           123:        if (!fstyle && ie != 0)
        !           124:        {
        !           125:                *str++ = 'E';
        !           126:                if (ie < 0)
        !           127:                {
        !           128:                        ie = -ie;
        !           129:                        *str++ = '-';
        !           130:                }
        !           131:                for (k=100; k > ie; k /=10);
        !           132:                for (; k > 0; k /=10)
        !           133:                {
        !           134:                        *str++ = ie/k + '0';
        !           135:                        ie = ie%k;
        !           136:                }
        !           137:        }
        !           138:        *str = '\0';
        !           139:        return;
        !           140: }
        !           141: 
        !           142: /* printf here to force loading of pfloat is printf is called. */
        !           143: 
        !           144: printf(arg0)
        !           145: char *arg0;
        !           146: {
        !           147:        extern int putchar();
        !           148:        return(format(putchar,"%r",&arg0));
        !           149: }
        !           150: 
        !           151: __dummy() {
        !           152:        extern pfloat(); /* force pfloat and pscien to be loaded */
        !           153:        pfloat();
        !           154: }

unix.superglobalmegacorp.com

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