Skip to content

Commit 85122f3

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 = 364596 12.9% 27.6% 37.9% basic = 364712 85.6% 60.5% 85.7% approx = 364964 100.0% 98.5% 99.8% exact = 366408 100.0% 100.0% 100.0% Note that when using REPR_C, a few test cases do not pass due to the missing bits in the actual value, which are now properly reflected inthe result by the format function. Signed-off-by: Yoctopuce dev <dev@yoctopuce.com>
1 parent 43fb0c3 commit 85122f3

22 files changed

+658
-393
lines changed

ports/unix/coverage.c

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

578-
// format float
579-
{
580-
mp_printf(&mp_plat_print, "# format float\n");
581-
582-
// format with inadequate buffer size
583-
char buf[5];
584-
mp_format_float(1, buf, sizeof(buf), 'g', 0, '+');
585-
mp_printf(&mp_plat_print, "%s\n", buf);
586-
587-
// format with just enough buffer so that precision must be
588-
// set from 0 to 1 twice
589-
char buf2[8];
590-
mp_format_float(1, buf2, sizeof(buf2), 'g', 0, '+');
591-
mp_printf(&mp_plat_print, "%s\n", buf2);
592-
593-
// format where precision is trimmed to avoid buffer overflow
594-
mp_format_float(1, buf2, sizeof(buf2), 'e', 0, '+');
595-
mp_printf(&mp_plat_print, "%s\n", buf2);
596-
}
597-
598578
// binary
599579
{
600580
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