63 lines
		
	
	
	
		
			1.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			63 lines
		
	
	
	
		
			1.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* $Header$ */
 | |
| #ifndef NOFLOAT
 | |
| extern char	*ecvt();
 | |
| 
 | |
| #define NDIGINEXP(exp)	(((exp) >= 100 || (exp) <= -100) ? 3 : 2)
 | |
| 
 | |
| char *
 | |
| gcvt(value, ndigit, buf)
 | |
| 	double value;
 | |
| 	char *buf;
 | |
| 	register int ndigit;
 | |
| {
 | |
| 	int sign, dp;
 | |
| 	register char *s1, *s2;
 | |
| 	register int i;
 | |
| 
 | |
| 	s1 = ecvt(value, ndigit, &dp, &sign);
 | |
| 	s2 = buf;
 | |
| 	if (sign) *s2++ = '-';
 | |
| 	for (i = ndigit - 1; i > 0 && s1[i] == '0'; i--) ndigit--;
 | |
| 	if (dp - ndigit > NDIGINEXP(dp) + 2 || dp < -NDIGINEXP(dp) - 1) {
 | |
| 		/* Use E format, otherwise we need too many '0''s */
 | |
| 		dp--;
 | |
| 		*s2++ = *s1++;
 | |
| 		*s2++ = '.';
 | |
| 		while (--ndigit > 0) *s2++ = *s1++;
 | |
| 		*s2++ = 'e';
 | |
| 		if (dp < 0) {
 | |
| 			*s2++ = '-';
 | |
| 			dp = -dp;
 | |
| 		}
 | |
| 		else	 *s2++ = '+';
 | |
| 		s2 += NDIGINEXP(dp);
 | |
| 		*s2 = 0;
 | |
| 		for (i = NDIGINEXP(dp); i > 0; i--) {
 | |
| 			*--s2 = dp % 10 + '0';
 | |
| 			dp /= 10;
 | |
| 		}
 | |
| 		return buf;
 | |
| 	}
 | |
| 	if (dp <= 0) {
 | |
| 		if (*s1 != '0')	{
 | |
| 			/* otherwise the whole number is 0 */
 | |
| 			*s2++ = '.';
 | |
| 		}
 | |
| 		while (dp < 0) {
 | |
| 			dp++;
 | |
| 			*s2++ = '0';
 | |
| 		}
 | |
| 	}
 | |
| 	for (i = 1; i <= ndigit; i++) {
 | |
| 		*s2++ = *s1++;
 | |
| 		if (i == dp) *s2++ = '.';
 | |
| 	}
 | |
| 	if (i <= dp) {
 | |
| 		while (i++ <= dp) *s2++ = '0';
 | |
| 		*s2++ = '.';
 | |
| 	}
 | |
| 	if (s2[-1]=='.') s2--;
 | |
| 	*s2 = '\0';
 | |
| 	return buf;
 | |
| }
 | |
| #endif
 |