circuitpython/tests/ports/unix
Yoctopuce dev dbbaa959c8 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` (in CPython it's 100%).

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 the 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>
2025-08-01 00:47:33 +10:00
..
extra_coverage.py py/obj: Add functions to retrieve large integers from mp_obj_t. 2025-07-09 11:54:21 +10:00
extra_coverage.py.exp py/formatfloat: Improve accuracy of float formatting code. 2025-08-01 00:47:33 +10:00
ffi_callback.py tests: Move port-specific test directories into tests/ports/ directory. 2024-01-22 11:48:27 +11:00
ffi_callback.py.exp tests: Move port-specific test directories into tests/ports/ directory. 2024-01-22 11:48:27 +11:00
ffi_float.py tests: Move port-specific test directories into tests/ports/ directory. 2024-01-22 11:48:27 +11:00
ffi_float.py.exp tests: Move port-specific test directories into tests/ports/ directory. 2024-01-22 11:48:27 +11:00
ffi_float2.py py/formatfloat: Improve accuracy of float formatting code. 2025-08-01 00:47:33 +10:00
ffi_float2.py.exp py/formatfloat: Improve accuracy of float formatting code. 2025-08-01 00:47:33 +10:00
ffi_int_base.py tests/ports/unix: Update and extend the modffi integer tests. 2024-09-19 15:00:17 +10:00
ffi_int_long32.py tests/ports/unix: Update and extend the modffi integer tests. 2024-09-19 15:00:17 +10:00
ffi_int_long32.py.exp tests/ports/unix: Update and extend the modffi integer tests. 2024-09-19 15:00:17 +10:00
ffi_int_long64.py tests/ports/unix: Update and extend the modffi integer tests. 2024-09-19 15:00:17 +10:00
ffi_int_long64.py.exp tests/ports/unix: Update and extend the modffi integer tests. 2024-09-19 15:00:17 +10:00
ffi_int_types.py tests/ports/unix: Update and extend the modffi integer tests. 2024-09-19 15:00:17 +10:00
ffi_int_types.py.exp tests/ports/unix: Update and extend the modffi integer tests. 2024-09-19 15:00:17 +10:00
ffi_lib.c tests/ports/unix: Update and extend the modffi integer tests. 2024-09-19 15:00:17 +10:00
mod_os.py tests: Move port-specific test directories into tests/ports/ directory. 2024-01-22 11:48:27 +11:00
mod_os.py.exp tests: Move port-specific test directories into tests/ports/ directory. 2024-01-22 11:48:27 +11:00
time_mktime_localtime.py tests: Move port-specific test directories into tests/ports/ directory. 2024-01-22 11:48:27 +11:00