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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy