circuitpython/tests/ports/unix/extra_coverage.py.exp
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

266 lines
3.4 KiB
Text

# mp_printf
-123 +123 123
-0123
123
123f
123F
7fffffffffffffff
7FFFFFFFFFFFFFFF
18446744073709551615
789f
789F
ab abc ' abc' ' True' 'Tru'
false true
(null)
-2147483648
2147483648
8000000f
8000000F
abc
%
.a .
<%>
<aaaa>
<true>
<43690>
<43690>
<43690>
<test>
<1000.000000>
<True>
<9223372036854775807>
# GC
0
0
# GC part 2
pass
# tracked allocation
m_tracked_head = 0
0 1
1 1
2 1
3 1
4 1
5 1
6 1
7 1
0 1
1 1
2 1
3 1
4 1
5 1
6 1
7 1
m_tracked_head = 0
# vstr
tests
sts
test
tes
RuntimeError:
RuntimeError:
# repl
ame__
port
builtins micropython array binascii
btree cexample cmath collections
cppexample cryptolib deflate errno
example_package ffi framebuf
gc hashlib heapq io
json machine marshal math
os platform random re
select socket struct sys
termios time tls uctypes
vfs websocket
me
micropython machine marshal math
argv atexit byteorder exc_info
executable exit getsizeof implementation
intern maxsize modules path
platform print_exception ps1
ps2 settrace stderr stdin
stdout tracebacklimit version version_info
ementation
# attrtuple
(start=1, stop=2, step=3)
# str
1
# bytearray
data
# mpz
1
12345678
0
0
0
0
0
1
12345
6
-1
0
1
0
0.000000
deadbeef
c0ffee777c0ffee
deadbeef
0deadbeef
c0ffee
000c0ffee
# runtime utils
TypeError: unsupported type for __abs__: 'str'
TypeError: unsupported types for __divmod__: 'str', 'str'
0
1
2
OverflowError: overflow converting long int to machine word
OverflowError: overflow converting long int to machine word
TypeError: can't convert NoneType to int
TypeError: can't convert NoneType to int
ValueError:
Warning: test
# binary
123
456
# VM
2 1
# scheduler
sched(0)=1
sched(1)=1
sched(2)=1
sched(3)=1
sched(4)=0
unlocked
0
1
2
3
KeyboardInterrupt:
KeyboardInterrupt:
10
loop
scheduled function
loop
scheduled function
loop
scheduled function
scheduled function
# ringbuf
99 0
98 1
22
99 0
97 2
aa55
99 0
0 99
-1
1 98
-1
2 97
0
cc99
99 0
0
11bb
0
22ff
-1
-1
0
0
abc123
-1
-2
# pairheap
create: 0 0 0 0
pop all: 0 1 2 3
create: 7 6 5 4 3 2 1 0
pop all: 0 1 2 3 4 5 6 7
create: 1 - - 1 1 1 1 1 1
pop all: 1 2
create: 1 1 1 1 2 2
pop all: 2 4
create: 1 1 1 1 1
pop all: 1 3 4
create: 3 3 3 1 1 1
pop all: 1 2 4 5
# mp_obj_is_type
1 1
0 0
1 1
1 1
0 0
1 1
# stackctrl
1 1
# end coverage.c
0123456789 b'0123456789'
7300
7300
7300
7300
None
None
None
None
None
None
b'123'
b'123'
b'123'
OSError
0
None
None
cpp None
(3, 'hellocpp')
frzstr1
frzstr1.py
frzmpy1
frzmpy1.py
frzstr_pkg1.__init__
frzstr_pkg1/__init__.py 1
frzmpy_pkg1.__init__
frzmpy_pkg1/__init__.py 1
frzstr_pkg2.mod
1
frzmpy_pkg2.mod
1
ZeroDivisionError
\
X
'\x1b'
b'\x00\xff'
frzmpy4 1
frzmpy4 2
NULL
uPy
a long string that is not interned
a string that has unicode αβγ chars
b'bytes 1234\x01'
123456789
0
1
2
3
frozentest.py
example_package.__init__
<module 'example_package.foo.bar'>
example_package.foo.bar.f
<module 'example_package'> <module 'example_package.foo'> <module 'example_package.foo.bar'>
example_package.f
example_package.foo.f
example_package.foo.bar.f
True
example_package.foo.f
True