use cleaner code for handling float rounding in vfprintf
authorSzabolcs Nagy <nsz@port70.net>
Fri, 30 May 2014 15:09:53 +0000 (17:09 +0200)
committerRich Felker <dalias@aerifal.cx>
Fri, 30 May 2014 17:06:51 +0000 (13:06 -0400)
CONCAT(0x1p,LDBL_MANT_DIG) is not safe outside of libc,
use 2/LDBL_EPSILON instead.

fix was proposed by Morten Welinder.

src/stdio/vfprintf.c

index f6e7f38d21cd06c03985edb5471b59b748f8eaae..ea257720bf8088fb2e1106590fbe7f7df609eaba 100644 (file)
@@ -13,8 +13,6 @@
 
 #define MAX(a,b) ((a)>(b) ? (a) : (b))
 #define MIN(a,b) ((a)<(b) ? (a) : (b))
-#define CONCAT2(x,y) x ## y
-#define CONCAT(x,y) CONCAT2(x,y)
 
 /* Convenient bit representation for modifier flags, which all fall
  * within 31 codepoints of the space character. */
@@ -343,7 +341,7 @@ static int fmt_fp(FILE *f, long double y, int w, int p, int fl, int t)
                x = *d % i;
                /* Are there any significant digits past j? */
                if (x || d+1!=z) {
-                       long double round = CONCAT(0x1p,LDBL_MANT_DIG);
+                       long double round = 2/LDBL_EPSILON;
                        long double small;
                        if (*d/i & 1) round += 2;
                        if (x<i/2) small=0x0.8p0;