Fix precison of fixed-point formatting

Fixes #908
This commit is contained in:
Rangi
2021-10-27 20:24:54 -04:00
committed by Eldred Habert
parent 646fc62b89
commit b002d95459
4 changed files with 13 additions and 17 deletions

View File

@@ -228,21 +228,13 @@ void fmt_PrintNumber(char *buf, size_t bufLen, struct FormatSpec const *fmt, uin
/* Default fractional width (C's is 6 for "%f"; here 5 is enough) */ /* Default fractional width (C's is 6 for "%f"; here 5 is enough) */
size_t fracWidth = fmt->hasFrac ? fmt->fracWidth : 5; size_t fracWidth = fmt->hasFrac ? fmt->fracWidth : 5;
if (fracWidth) { if (fracWidth > 255) {
if (fracWidth > 255) { error("Fractional width %zu too long, limiting to 255\n",
error("Fractional width %zu too long, limiting to 255\n", fracWidth);
fracWidth); fracWidth = 255;
fracWidth = 255;
}
char spec[16]; /* Max "%" + 5-char PRIu32 + ".%0255.f" + terminator */
snprintf(spec, sizeof(spec), "%%" PRIu32 ".%%0%zu.f", fracWidth);
snprintf(valueBuf, sizeof(valueBuf), spec, value >> 16,
(value % 65536) / 65536.0 * pow(10, fracWidth) + 0.5);
} else {
snprintf(valueBuf, sizeof(valueBuf), "%" PRIu32, value >> 16);
} }
snprintf(valueBuf, sizeof(valueBuf), "%.*f", (int)fracWidth, value / 65536.0);
} else { } else {
char const *spec = fmt->type == 'd' ? "%" PRId32 char const *spec = fmt->type == 'd' ? "%" PRId32
: fmt->type == 'u' ? "%" PRIu32 : fmt->type == 'u' ? "%" PRIu32

View File

@@ -9,3 +9,6 @@ pr = 16.12
fl = 6.283185 fl = 6.283185
println "`6.283185`: {.6f:fl} -> ${08x:fl}" println "`6.283185`: {.6f:fl} -> ${08x:fl}"
fr = MUL(20.0, 0.32)
println "32% of 20 = {f:fr} (~{.2f:fr}) (~~{.0f:fr})"

View File

@@ -1,5 +1,6 @@
`3.1`: 3.100007 -> $0003199a `3.1`: 3.100006 -> $0003199a
`5.2`: 5.199997 -> $00053333 `5.2`: 5.199997 -> $00053333
`MUL`: 16.120026 -> $00101eba `MUL`: 16.120026 -> $00101eba
`16.12`: 16.119996 -> $00101eb8 `16.12`: 16.119995 -> $00101eb8
`6.283185`: 6.283188 -> $0006487f `6.283185`: 6.283188 -> $0006487f
32% of 20 = 6.40015 (~6.40) (~~6)

View File

@@ -1,5 +1,5 @@
< 300 > <+00300> < 12c> < %100101100> < 300 > <+00300> < 12c> < %100101100>
<4294967254> <-42> <&000037777777726> <4294967254> <-42> <&000037777777726>
<3.14159> <-00123> <-123.0455932618> <3.14159> <-00123> <-123.0455932617>
<hello > < hello> <hello > < hello>
<300 > <300 >