#define _GNU_SOURCE #include #include #include char* fcvt(double x, int n, int* dp, int* sign) { char tmp[1500]; int i, lz; if (n > 1400U) n = 1400; sprintf(tmp, "%.*f", n, x); i = (tmp[0] == '-'); if (tmp[i] == '0') lz = strspn(tmp + i + 2, "0"); else lz = -(int)strcspn(tmp + i, "."); if (n <= lz) { *sign = i; *dp = 1; if (n > 14U) n = 14; return (char*)"000000000000000" + 14 - n; } return ecvt(x, n - lz, dp, sign); }