Files
micropython/tests/float/float_parse.py
Yoctopuce dev 5fdd249c55 py/parsenum: Reduce code footprint of mp_parse_num_float.
The mantissa parsing code uses a floating point variable to accumulate
digits.  Using an `mp_float_uint_t` variable instead and casting to
`mp_float_t` at the very end reduces code size.  In some cases, it also
improves the rounding behaviour as extra digits are taken into account
by the int-to-float conversion code.

An extra test case handles the special case where mantissa overflow occurs
while processing deferred trailing zeros.

Signed-off-by: Yoctopuce dev <dev@yoctopuce.com>
2025-02-28 13:35:12 +11:00

40 lines
1.3 KiB
Python

# test parsing of floats
inf = float("inf")
# it shouldn't matter where the decimal point is if the exponent balances the value
print(float("1234") - float("0.1234e4"))
print(float("1.015625") - float("1015625e-6"))
# very large integer part with a very negative exponent should cancel out
print("%.4e" % float("9" * 60 + "e-60"))
print("%.4e" % float("9" * 60 + "e-40"))
# many fractional digits
print(float("." + "9" * 70))
print(float("." + "9" * 70 + "e20"))
print(float("." + "9" * 70 + "e-50") == float("1e-50"))
# tiny fraction with large exponent
print(float("." + "0" * 60 + "1e10") == float("1e-51"))
print(float("." + "0" * 60 + "9e25") == float("9e-36"))
print(float("." + "0" * 60 + "9e40") == float("9e-21"))
# ensure that accuracy is retained when value is close to a subnormal
print(float("1.00000000000000000000e-37"))
print(float("10.0000000000000000000e-38"))
print(float("100.000000000000000000e-39"))
# very large exponent literal
print(float("1e4294967301"))
print(float("1e-4294967301"))
print(float("1e18446744073709551621"))
print(float("1e-18446744073709551621"))
# mantissa overflow while processing deferred trailing zeros
print(float("10000000000000000000001"))
# check small decimals are as close to their true value as possible
for n in range(1, 10):
print(float("0.%u" % n) == n / 10)