Skip to content

Commit 314df34

Browse files
committed
py/formatfloat: Improve accuracy of float formatting code.
Following discussions in PR #16666, this commit updates the float formatting code to improve the `repr` reversibility, i.e. the percentage of valid floating point numbers that do parse back to the same number when formatted by `repr`. This new code initially offers a choice of 3 float conversion methods, depending on the desired tradeoff between code footprint and precision: - BASIC method is the smallest code footprint - APPROX method uses an iterative method to approximate the exact representation, which is a bit slower but but does not have a big impact on code size - EXACT method uses higher-precision floats during conversion, which provides best results but has a higher impact on code size. It is faster than APPROX method. Here is the table comparing the impact of the three conversion methods on code footprint on PYBV10 (using single-precision floats) and reversibility rate for both single-precision and double-precision floats. The table includes current situation as a baseline for the comparison: PYBV10 FLOAT DOUBLE current = 364136 85.47% 37.90% basic = 364188 97.78% 62.18% approx = 364396 99.70% 99.84% exact = 365608 100.00% 100.00% The commit also include two minor fix for nanbox, that were preventing the new CI tests to run properly on that port. Signed-off-by: Yoctopuce dev <dev@yoctopuce.com>
1 parent cfcc53d commit 314df34

21 files changed

+723
-490
lines changed

ports/unix/coverage.c

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -539,26 +539,6 @@ static mp_obj_t extra_coverage(void) {
539539
mp_emitter_warning(MP_PASS_CODE_SIZE, "test");
540540
}
541541

542-
// format float
543-
{
544-
mp_printf(&mp_plat_print, "# format float\n");
545-
546-
// format with inadequate buffer size
547-
char buf[5];
548-
mp_format_float(1, buf, sizeof(buf), 'g', 0, '+');
549-
mp_printf(&mp_plat_print, "%s\n", buf);
550-
551-
// format with just enough buffer so that precision must be
552-
// set from 0 to 1 twice
553-
char buf2[8];
554-
mp_format_float(1, buf2, sizeof(buf2), 'g', 0, '+');
555-
mp_printf(&mp_plat_print, "%s\n", buf2);
556-
557-
// format where precision is trimmed to avoid buffer overflow
558-
mp_format_float(1, buf2, sizeof(buf2), 'e', 0, '+');
559-
mp_printf(&mp_plat_print, "%s\n", buf2);
560-
}
561-
562542
// binary
563543
{
564544
mp_printf(&mp_plat_print, "# binary\n");

0 commit comments

Comments
 (0)