2 #define DIGMAX 30 /* max # of digits in string */
3 #define DIGPREC 17 /* max # of significant digits */
6 static char digstr
[DIGMAX
+ 1 + 1]; /* +1 for end of string */
8 /* +1 in case rounding adds */
10 static double negtab
[] =
11 { 1e-256, 1e-128, 1e-64, 1e-32, 1e-16, 1e-8, 1e-4, 1e-2, 1e-1, 1.0 };
12 static double postab
[] =
13 { 1e+256, 1e+128, 1e+64, 1e+32, 1e+16, 1e+8, 1e+4, 1e+2, 1e+1 };
17 /*************************
18 * Convert double val to a string of
20 * ndig = # of digits in resulting string
22 * *pdecpt = position of decimal point from left of first digit
23 * *psign = nonzero if value was negative
26 ecvt(val
, ndig
, pdecpt
, psign
)
28 int ndig
, *pdecpt
, *psign
;
31 return _cvt(ECVT
, val
, ndig
, pdecpt
, psign
);
35 fcvt(val
, nfrac
, pdecpt
, psign
)
37 int nfrac
, *pdecpt
, *psign
;
40 return _cvt(FCVT
, val
, nfrac
, pdecpt
, psign
);
44 _cvt(cnvflag
, val
, ndig
, pdecpt
, psign
)
46 int ndig
, *pdecpt
, *psign
;
51 *psign
= (val
< 0) ? ((val
= -val
), 1) : 0;
52 ndig
= (ndig
< 0) ? 0 : (ndig
< DIGMAX
) ? ndig
: DIGMAX
;
54 for (p
= &digstr
[0]; p
< &digstr
[ndig
]; p
++)
58 /* Adjust things so that 1 <= val < 10 */
59 /* in these loops if val == MAXDOUBLE) */
64 while (val
< negtab
[i
+ 1]) {
74 while (val
>= postab
[i
]) {
81 if (cnvflag
== FCVT
) {
83 ndig
= (ndig
< 0) ? 0 : (ndig
< DIGMAX
) ? ndig
: DIGMAX
;
86 /* Pick off digits 1 by 1 and stuff into digstr[] */
87 /* Do 1 extra digit for rounding purposes */
88 for (p
= &digstr
[0]; p
<= &digstr
[ndig
]; p
++) {
91 /* 'twould be silly to have zillions of digits */
92 /* when only DIGPREC are significant */
93 if (p
>= &digstr
[DIGPREC
])
99 val
= (val
- n
) * 10; /* get next digit */
102 if (*--p
>= '5') { /* if we need to round */
104 if (p
== &digstr
[0]) { /* if at start */
106 decpt
++; /* shift dec pnt */
107 digstr
[0] = '1'; /* "100000..." */
120 digstr
[ndig
] = 0; /* terminate string */