fix: a time label's mantissa cannot reach its own radix
`format_time()` picked its sub-second rung from the raw value, so three significant figures of a value just under a rung's top rounded to 1000 and `%.3g` wrote that as an exponent: a one-second tick computed as 0.9999999 s read `1e+03ms`. The rung is now chosen by the rounded mantissa, which is the same 999.5 check `format_si()` already made for the SI prefixes, and a value that rounds to a whole second leaves the sub-second branch entirely.
This commit is contained in:
1 parent
c2c8c596f3
commit
58473db384
2 files changed
+21
-2
No files matched your search
+9
-2
@@ -98,7 +98,10 @@ void format_time(f64 seconds, char* buf, usize n) {
|
||||
const char* const sign = seconds < 0.0 ? "-" : "";
|
||||
const f64 t = std::fabs(seconds);
|
||||
|
||||
if (t < 1.0) {
|
||||
// `0.9995` and not `1.0`: three significant figures of 0.9999 s are `1e+03ms`, so a value
|
||||
// that *rounds* to a second belongs to the whole-second branch below, which writes it `1s`.
|
||||
// The same spill one rung down is handled inside the ladder.
|
||||
if (t < 0.9995) {
|
||||
// Sub-second: the prefix that keeps the mantissa in [1, 1000) -- the same rule the SI
|
||||
// formatter uses on a y axis, and the reading a zoomed-in window needs. A fixed
|
||||
// millisecond unit printed `0.005ms` where `5us` is what the axis is showing, and
|
||||
@@ -119,8 +122,12 @@ void format_time(f64 seconds, char* buf, usize n) {
|
||||
{1.0e-9, "ns"},
|
||||
{1.0e-12, "ps"},
|
||||
};
|
||||
// The rung is picked by the *rounded* mantissa, which is what `format_si`'s own 999.5
|
||||
// check buys there: 0.9999 ms is `999.9µs` before rounding and `1e+03µs` after, so it is
|
||||
// the millisecond rung's value and reads `1ms`. Testing the raw `t < u.scale` let the
|
||||
// mantissa reach 1000 at every rung boundary.
|
||||
for (const auto& u : kUnits) {
|
||||
if (t < u.scale) continue;
|
||||
if (t < u.scale * 0.9995) continue;
|
||||
std::snprintf(buf, n, "%s%.3g%s", sign, t / u.scale, u.unit);
|
||||
return;
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user