fix printf precision specifier for hex floats on non-ld80 archs
authorRich Felker <dalias@aerifal.cx>
Thu, 23 Aug 2018 19:24:03 +0000 (15:24 -0400)
committerRich Felker <dalias@aerifal.cx>
Thu, 23 Aug 2018 19:24:03 +0000 (15:24 -0400)
the code to perform rounding to the desired precision wrongly assumed
the long double mantissa was an integral number of nibbles (hex
digits) in length. this is true for 80-bit extended precision (64-bit
mantissa) but not for double (53) or quad (113).

scale the rounding value by 1<<(LDBL_MANT_DIG%4) to compensate.

src/stdio/vfprintf.c

index 50fb55c16149ed1166ff86077acf650f1efe721a..5e7be717333638bbef041a676199814811712925 100644 (file)
@@ -220,6 +220,7 @@ static int fmt_fp(FILE *f, long double y, int w, int p, int fl, int t)
                else re=LDBL_MANT_DIG/4-1-p;
 
                if (re) {
+                       round *= 1<<(LDBL_MANT_DIG%4);
                        while (re--) round*=16;
                        if (*prefix=='-') {
                                y=-y;