Skip to content

Commit 60a472d

Browse files
committed
Unify write_big scientific output via a has_point flag
Decide the notation flags (fixed, has_point) once in the %g branch, then emit scientific with a single shared block instead of separate %e/%g paths. Scientific becomes an early return so the larger fixed block sits at the top indentation level.
1 parent 72e9fb8 commit 60a472d

1 file changed

Lines changed: 32 additions & 40 deletions

File tree

zmij.cc

Lines changed: 32 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1746,58 +1746,50 @@ auto write_big(double value, int precision, char* out, size_t n,
17461746
}
17471747
}
17481748

1749+
bool has_point = precision != 0; // %e: a point iff fractional digits
17491750
if (general) {
17501751
// Drop trailing zeros and pick fixed or scientific.
17511752
while (num_digits > 1 && p[num_digits - 1] == '0') --num_digits;
17521753
fixed = lead_exp >= -4 && lead_exp < precision;
1754+
has_point = num_digits > 1; // a point iff significant fractional digits
17531755
}
17541756

1755-
if (fixed) {
1756-
int point_pos = lead_exp + 1; // digits before the decimal point
1757-
if (point_pos <= 0) { // |value| < 1, e.g. 0.00123
1758-
w.write('0');
1759-
} else {
1760-
int int_digits = num_digits < point_pos ? num_digits : point_pos;
1761-
w.write(p, int_digits);
1762-
w.write_zeros(point_pos - int_digits); // integer zeros, e.g. 12300
1763-
}
1764-
// %f emits exactly `precision` fractional digits; %g only significant ones.
1765-
int frac_width = general ? num_digits - point_pos : precision;
1766-
if (frac_width <= 0) return w.out; // no fractional part
1767-
w.write('.');
1768-
int lead_zeros = point_pos < 0 ? -point_pos : 0;
1769-
w.write_zeros(lead_zeros); // 0.00...
1770-
int frac_start = point_pos > 0 ? point_pos : 0;
1771-
int frac_digits = num_digits - frac_start;
1772-
if (frac_digits > 0)
1773-
w.write(p + frac_start, frac_digits);
1774-
else
1775-
frac_digits = 0;
1776-
return w.write_zeros(frac_width - lead_zeros - frac_digits);
1777-
}
1778-
1779-
// Scientific notation.
1780-
if (general) {
1781-
// %g: d.ddde±XX with only the significant digits.
1782-
w.write(p[0]);
1783-
if (num_digits > 1) {
1784-
w.write('.');
1785-
w.write(p + 1, num_digits - 1);
1786-
}
1787-
} else {
1788-
// %e: d.ddde±XX padded to `precision` fractional digits.
1757+
if (!fixed) {
1758+
// Scientific d.ddde±XX: %e pads to `precision` fractional digits, %g emits
1759+
// only the significant ones.
17891760
w.write(p[0]);
1790-
if (precision != 0) {
1761+
if (has_point) {
17911762
w.write('.');
17921763
w.write(p + 1, num_digits - 1);
1793-
w.write_zeros(precision - num_digits + 1);
1764+
if (!general) w.write_zeros(precision - num_digits + 1);
17941765
}
1766+
char exp[8];
1767+
char* exp_end = write_exp<double>(exp, lead_exp);
1768+
return w.write(exp, int(exp_end - exp));
17951769
}
17961770

1797-
// Shared exponent, e.g. e+00.
1798-
char exp[8];
1799-
char* exp_end = write_exp<double>(exp, lead_exp);
1800-
return w.write(exp, int(exp_end - exp));
1771+
// Fixed notation.
1772+
int point_pos = lead_exp + 1; // digits before the decimal point
1773+
if (point_pos <= 0) { // |value| < 1, e.g. 0.00123
1774+
w.write('0');
1775+
} else {
1776+
int int_digits = num_digits < point_pos ? num_digits : point_pos;
1777+
w.write(p, int_digits);
1778+
w.write_zeros(point_pos - int_digits); // integer zeros, e.g. 12300
1779+
}
1780+
// %f emits exactly `precision` fractional digits; %g only significant ones.
1781+
int frac_width = general ? num_digits - point_pos : precision;
1782+
if (frac_width <= 0) return w.out; // no fractional part
1783+
w.write('.');
1784+
int lead_zeros = point_pos < 0 ? -point_pos : 0;
1785+
w.write_zeros(lead_zeros); // 0.00...
1786+
int frac_start = point_pos > 0 ? point_pos : 0;
1787+
int frac_digits = num_digits - frac_start;
1788+
if (frac_digits > 0)
1789+
w.write(p + frac_start, frac_digits);
1790+
else
1791+
frac_digits = 0;
1792+
return w.write_zeros(frac_width - lead_zeros - frac_digits);
18011793
}
18021794

18031795
template <typename Float>

0 commit comments

Comments
 (0)