From cfa0a54c082d41db6446638eed1d57f163434092 Mon Sep 17 00:00:00 2001 From: Rich Felker Date: Thu, 23 Aug 2018 15:24:03 -0400 Subject: [PATCH] fix printf precision specifier for hex floats on non-ld80 archs 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 | 1 + 1 file changed, 1 insertion(+) diff --git a/src/stdio/vfprintf.c b/src/stdio/vfprintf.c index 50fb55c1..5e7be717 100644 --- a/src/stdio/vfprintf.c +++ b/src/stdio/vfprintf.c @@ -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;