|
|
1.1 ! root 1: /* ! 2: * ecvt converts to decimal ! 3: * the number of digits is specified by ndigit ! 4: * decpt is set to the position of the decimal point ! 5: * sign is set to 0 for positive, 1 for negative ! 6: */ ! 7: ! 8: char *cvt(); ! 9: ! 10: #define NDIG 80 ! 11: char* ! 12: ecvt(arg, ndigits, decpt, sign) ! 13: double arg; ! 14: int ndigits, *decpt, *sign; ! 15: { ! 16: return(cvt(arg, ndigits, decpt, sign, 1)); ! 17: } ! 18: ! 19: char* ! 20: fcvt(arg, ndigits, decpt, sign) ! 21: double arg; ! 22: int ndigits, *decpt, *sign; ! 23: { ! 24: return(cvt(arg, ndigits, decpt, sign, 0)); ! 25: } ! 26: ! 27: static char* ! 28: cvt(arg, ndigits, decpt, sign, eflag) ! 29: double arg; ! 30: int ndigits, *decpt, *sign; ! 31: { ! 32: register int r2; ! 33: double fi, fj; ! 34: register char *p, *p1; ! 35: static char buf[NDIG]; ! 36: double modf(); ! 37: ! 38: if (ndigits<0) ! 39: ndigits = 0; ! 40: if (ndigits>=NDIG-1) ! 41: ndigits = NDIG-2; ! 42: r2 = 0; ! 43: *sign = 0; ! 44: p = &buf[0]; ! 45: if (arg<0) { ! 46: *sign = 1; ! 47: arg = -arg; ! 48: } ! 49: arg = modf(arg, &fi); ! 50: p1 = &buf[NDIG]; ! 51: /* ! 52: * Do integer part ! 53: */ ! 54: if (fi != 0) { ! 55: p1 = &buf[NDIG]; ! 56: while (fi != 0) { ! 57: fj = modf(fi/10, &fi); ! 58: *--p1 = (int)((fj+.03)*10) + '0'; ! 59: r2++; ! 60: } ! 61: while (p1 < &buf[NDIG]) ! 62: *p++ = *p1++; ! 63: } else if (arg > 0) { ! 64: while ((fj = arg*10) < 1) { ! 65: arg = fj; ! 66: r2--; ! 67: } ! 68: } ! 69: p1 = &buf[ndigits]; ! 70: if (eflag==0) ! 71: p1 += r2; ! 72: *decpt = r2; ! 73: if (p1 < &buf[0]) { ! 74: buf[0] = '\0'; ! 75: return(buf); ! 76: } ! 77: while (p<=p1 && p<&buf[NDIG]) { ! 78: arg *= 10; ! 79: arg = modf(arg, &fj); ! 80: *p++ = (int)fj + '0'; ! 81: } ! 82: if (p1 >= &buf[NDIG]) { ! 83: buf[NDIG-1] = '\0'; ! 84: return(buf); ! 85: } ! 86: p = p1; ! 87: *p1 += 5; ! 88: while (*p1 > '9') { ! 89: *p1 = '0'; ! 90: if (p1>buf) ! 91: ++*--p1; ! 92: else { ! 93: *p1 = '1'; ! 94: (*decpt)++; ! 95: if (eflag==0) { ! 96: if (p>buf) ! 97: *p = '0'; ! 98: p++; ! 99: } ! 100: } ! 101: } ! 102: *p = '\0'; ! 103: return(buf); ! 104: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.