diff options
author | Rich Felker <dalias@aerifal.cx> | 2018-08-23 15:24:03 -0400 |
---|---|---|
committer | Rich Felker <dalias@aerifal.cx> | 2018-08-23 15:24:03 -0400 |
commit | cfa0a54c082d41db6446638eed1d57f163434092 (patch) | |
tree | 91f68ffa2487046482925443e7abe39b8388a4da | |
parent | 6aeb131b4c1aee30d7f7125a8a88ce6f41172f01 (diff) | |
download | musl-cfa0a54c082d41db6446638eed1d57f163434092.zip musl-cfa0a54c082d41db6446638eed1d57f163434092.tar.gz musl-cfa0a54c082d41db6446638eed1d57f163434092.tar.bz2 |
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.
-rw-r--r-- | src/stdio/vfprintf.c | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/src/stdio/vfprintf.c b/src/stdio/vfprintf.c index 50fb55c..5e7be71 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; |