Skip to content

Commit ab1173c

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 offers a choice of 3 float conversion methods, depending on the desired tradeoff between code size and conversion 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. It provides `repr` reversibility on >99.8% of the cases in double precision, and on >98.5% in single precision (except with REPR_C, where reversibility is 100% as the last two bits are not taken into account). - EXACT method uses higher-precision floats during conversion, which provides perfect results but has a higher impact on code size. It is faster than APPROX method, and faster than CPython equivalent implementation. It is however not available on all compilers when using FLOAT_IMPL_DOUBLE. 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 REPR_C FLOAT DOUBLE current = 364688 12.9% 27.6% 37.9% basic = 364812 85.6% 60.5% 85.7% approx = 365080 100.0% 98.5% 99.8% exact = 366408 100.0% 100.0% 100.0% Signed-off-by: Yoctopuce dev <dev@yoctopuce.com>
1 parent 465b967 commit ab1173c

24 files changed

+776
-394
lines changed

ports/esp8266/mpconfigport.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@
106106
#define MICROPY_PY_OS_URANDOM (1)
107107
#define MICROPY_LONGINT_IMPL (MICROPY_LONGINT_IMPL_MPZ)
108108
#define MICROPY_FLOAT_IMPL (MICROPY_FLOAT_IMPL_FLOAT)
109+
#define MICROPY_FLOAT_FORMAT_IMPL (MICROPY_FLOAT_FORMAT_IMPL_BASIC)
109110
#define MICROPY_WARNINGS (1)
110111
#define MICROPY_PY_STR_BYTES_CMP_WARN (1)
111112
#define MICROPY_STREAMS_POSIX_API (1)

ports/unix/coverage.c

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

610-
// format float
611-
{
612-
mp_printf(&mp_plat_print, "# format float\n");
613-
614-
// format with inadequate buffer size
615-
char buf[5];
616-
mp_format_float(1, buf, sizeof(buf), 'g', 0, '+');
617-
mp_printf(&mp_plat_print, "%s\n", buf);
618-
619-
// format with just enough buffer so that precision must be
620-
// set from 0 to 1 twice
621-
char buf2[8];
622-
mp_format_float(1, buf2, sizeof(buf2), 'g', 0, '+');
623-
mp_printf(&mp_plat_print, "%s\n", buf2);
624-
625-
// format where precision is trimmed to avoid buffer overflow
626-
mp_format_float(1, buf2, sizeof(buf2), 'e', 0, '+');
627-
mp_printf(&mp_plat_print, "%s\n", buf2);
628-
}
629-
630610
// binary
631611
{
632612
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