2 * fltpr.c - print floating point numbers
4 /* $Id: fltpr.c,v 1.6 1994/06/24 11:49:19 ceriel Exp $ */
12 _pfloat(long double r, register char *s, int n, int flags)
18 s1 = _fcvt(r, n, &dp, &sign);
21 else if (flags & FL_SIGN)
23 else if (flags & FL_SPACE)
29 if (*s1) *s++ = *s1++;
31 if (((i=n) > 0) || (flags & FL_ALT))
39 if (*s1) *s++ = *s1++;
45 _pscien(long double r, register char *s, int n, int flags)
50 s1 = _ecvt(r, n + 1, &dp, &sign);
53 else if (flags & FL_SIGN)
55 else if (flags & FL_SPACE)
59 if ((n > 0) || (flags & FL_ALT))
62 if (*s1) *s++ = *s1++;
67 *s++ = '-' ; dp= -dp ;
72 *s++ = '0' + (dp / 100);
80 #define NDIGINEXP(exp) (((exp) >= 100 || (exp) <= -100) ? 3 : 2)
82 #define USE_EXP(exp, ndigits) (((exp) < LOW_EXP + 1) || (exp >= ndigits + 1))
85 _gcvt(long double value, int ndigit, char *s, int flags)
88 register char *s1, *s2;
90 register int nndigit = ndigit;
92 s1 = _ecvt(value, ndigit, &dp, &sign);
94 if (sign) *s2++ = '-';
95 else if (flags & FL_SIGN)
97 else if (flags & FL_SPACE)
100 if (!(flags & FL_ALT))
101 for (i = nndigit - 1; i > 0 && s1[i] == '0'; i--)
104 if (USE_EXP(dp,ndigit)) {
108 if ((nndigit > 1) || (flags & FL_ALT)) *s2++ = '.';
109 while (--nndigit > 0) *s2++ = *s1++;
118 for (i = NDIGINEXP(dp); i > 0; i--) {
119 *--s2 = dp % 10 + '0';
127 /* otherwise the whole number is 0 */
136 for (i = 1; i <= nndigit; i++) {
138 if (i == dp) *s2++ = '.';
141 while (i++ <= dp) *s2++ = '0';
144 if ((s2[-1]=='.') && !(flags & FL_ALT)) s2--;
150 _f_print(va_list *ap, int flags, char *s, char c, int precision)
152 register char *old_s = s;
155 if (flags & FL_LONGDOUBLE) ld_val = va_arg(*ap, long double);
156 else ld_val = (long double) va_arg(*ap, double);
160 s = _pfloat(ld_val, s, precision, flags);
164 s = _pscien(ld_val, s, precision , flags);
168 s = _gcvt(ld_val, precision, s, flags);
172 if ( c == 'E' || c == 'G') {
173 while (*old_s && *old_s != 'e') old_s++;
174 if (*old_s == 'e') *old_s = 'E';