Skip to content

Commit 11a8e87

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. - 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, 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 FLOAT DOUBLE current = 364136 27.57% 37.90% basic = 364188 91.01% 62.18% approx = 364396 98.50% 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 09541b7 commit 11a8e87

21 files changed

+742
-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