/* test-printf-round.c */ #define _POSIX_SOURCE #define _XOPEN_SOURCE 600 #include #include #include #if 0 #define V 0X1.52f8a8e32e982P+140 #define V 0X0.0000000000000P+0 #endif #define V 0X1.52f8a8e32e982P-140 #define DECIMALS 43 int main(void) { int decpt = 0; int sgn = -1; char *b; static char zeros[128] = "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; static char buf[128] = { 0 }; b = fcvtbuf(V, DECIMALS, &decpt, &sgn, buf); printf("sgn %d decpt %d %s%.*s%s%s %.*f\n", sgn, decpt, !sgn ? "+" : 1 == sgn ? "-" : "", /* 0 < decpt -> decpt digits | . | buf + decpt digits */ /* decpt < 0 -> 0. | decpt zeros | buf digits */ decpt < 0 ? 2 : decpt, decpt < 0 ? "0." : b, decpt < 0 ? zeros + strlen(zeros) + decpt : ".", decpt < 0 ? b : b + decpt, DECIMALS, V); }