static double ecvt_rint(double x);
static double ecvt_copysign(double x, double y);
static char *cvt();
#define NDIG 350
char*
ecvt(arg, ndigits, decptp, signp)
double arg;
int ndigits, *decptp, *signp;
{
return(cvt(arg, ndigits, decptp, signp, 1));
}
char*
fcvt(arg, ndigits, decptp, signp)
double arg;
int ndigits, *decptp, *signp;
{
return(cvt(arg, ndigits, decptp, signp, 0));
}
static char*
cvt(arg, ndigits, decptp, signp, eflag)
double arg;
int ndigits, *decptp, *signp;
int eflag;
{
register int decpt;
double fi, fj;
register char *p, *p1;
static char buf[NDIG] = { 0 };
double modf();
if (ndigits < 0)
ndigits = 0;
if (ndigits >= NDIG-1)
ndigits = NDIG-2;
decpt = 0;
*signp = 0;
p = &buf[0];
if (arg == 0) {
*decptp = 0;
while (p < &buf[ndigits])
*p++ = '0';
*p = '\0';
return(buf);
} else if (arg < 0) {
*signp = 1;
arg = -arg;
}
arg = modf(arg, &fi);
p1 = &buf[NDIG];
if (fi != 0) {
while (fi != 0) {
fj = modf(fi/10, &fi);
*--p1 = (int)ecvt_rint((fj)*10) + '0';
decpt++;
}
while (p1 < &buf[NDIG])
*p++ = *p1++;
} else if (arg > 0) {
while ((fj = arg*10) < 1) {
arg = fj;
decpt--;
}
}
*decptp = decpt;
p1 = &buf[ndigits];
if (eflag==0) {
p1 += decpt;
if (p1 < &buf[0]) {
buf[0] = '\0';
return(buf);
}
}
while (p <= p1 && p < &buf[NDIG]) {
arg *= 10;
arg = modf(arg, &fj);
*p++ = (int)fj + '0';
}
if (p1 >= &buf[NDIG]) {
buf[NDIG-1] = '\0';
return(buf);
}
p = p1;
*p1 += 5;
while (*p1 > '9') {
*p1 = '0';
if (p1 > buf)
++*--p1;
else {
*p1 = '1';
(*decptp)++;
if (eflag == 0) {
if (p > buf)
*p = '0';
p++;
}
}
}
*p = '\0';
return(buf);
}
static double ecvt_rint(double x)
{
asm("frndint" : "=t" (x) : "0" (x));
return(x);
}