musl - musl - an implementation of the standard library for Linux-based systems

index : musl
musl - an implementation of the standard library for Linux-based systems
summary refs log tree commit diff
path: root/src/stdio/vfprintf.c
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2014年04月07日 13:50:05 -0400
committerRich Felker <dalias@aerifal.cx>2014年04月07日 13:50:05 -0400
commite94d0692864ecf9522fd6a97610a47a2f718d3de (patch)
tree9270fe106eae71c137ab703d3209ce9c1b466ed8 /src/stdio/vfprintf.c
parentefe07b0f8914eccf5eabce0dbd6ea5da7d7db38c (diff)
downloadmusl-e94d0692864ecf9522fd6a97610a47a2f718d3de.tar.gz
fix printf rounding with %g for some corner case midpoints
the subsequent rounding code assumes the end pointer (z) accurately reflects the end of significance in the decimal expansion, but for certain large integers, spurious trailing zero slots were left behind when applying the binary exponent. issue reported by Morten Welinder; the analysis of the cause was performed by nsz, who also proposed this change.
Diffstat (limited to 'src/stdio/vfprintf.c')
-rw-r--r--src/stdio/vfprintf.c 2
1 files changed, 1 insertions, 1 deletions
diff --git a/src/stdio/vfprintf.c b/src/stdio/vfprintf.c
index 0be75498..f6e7f38d 100644
--- a/src/stdio/vfprintf.c
+++ b/src/stdio/vfprintf.c
@@ -308,8 +308,8 @@ static int fmt_fp(FILE *f, long double y, int w, int p, int fl, int t)
*d = x % 1000000000;
carry = x / 1000000000;
}
- if (!z[-1] && z>a) z--;
if (carry) *--a = carry;
+ while (z>a && !z[-1]) z--;
e2-=sh;
}
while (e2<0) {
generated by cgit v1.2.1 (git 2.18.0) at 2025年10月07日 03:21:34 +0000

AltStyle によって変換されたページ (->オリジナル) /