@@ -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
18031795template <typename Float>
0 commit comments