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