py/formatfloat: Fix number of digits and exponent sign when rounding.

This patch fixes 2 things when printing a floating-point number that
requires rounding up of the mantissa:
- retain the correct precision; eg 0.99 becomes 1.0, not 1.00
- if the exponent goes from -1 to 0 then render it as +0, not -0
This commit is contained in:
Damien George 2017-06-13 13:36:56 +10:00
parent d42b80fd64
commit 6ed4581f54
4 changed files with 11 additions and 5 deletions

View File

@ -376,11 +376,16 @@ int mp_format_float(FPTYPE f, char *buf, size_t buf_size, char fmt, int prec, ch
rs[1] = '0'; rs[1] = '0';
if (e_sign == '-') { if (e_sign == '-') {
e--; e--;
if (e == 0) {
e_sign = '+';
}
} else { } else {
e++; e++;
} }
} else {
// Need at extra digit at the end to make room for the leading '1'
s++;
} }
s++;
char *ss = s; char *ss = s;
while (ss > rs) { while (ss > rs) {
*ss = ss[-1]; *ss = ss[-1];

View File

@ -44,3 +44,6 @@ print(('%.40g' % 1e-3)[:2])
print(('%.40g' % 1e-4)[:2]) print(('%.40g' % 1e-4)[:2])
print("%.0g" % 1) # 0 precision 'g' print("%.0g" % 1) # 0 precision 'g'
print('%.1e' % 9.99) # round up with positive exponent
print('%.1e' % 0.999) # round up with negative exponent

View File

@ -1,4 +1,3 @@
# uPy and CPython outputs differ for the following # uPy and CPython outputs differ for the following
print("%.1g" % -9.9) # round up 'g' with '-' sign print("%.1g" % -9.9) # round up 'g' with '-' sign
print("%.1e" % 9.99) # round up with positive exponent print("%.2g" % 99.9) # round up
print("%.1e" % 0.999) # round up with negative exponent

View File

@ -1,3 +1,2 @@
-10 -10
1.00e+01 100
1.00e-00