Add a new MICROPY_COMP_CONST_FLOAT feature, enabled by in mpy-cross and
when compiling with MICROPY_CONFIG_ROM_LEVEL_CORE_FEATURES. The new
feature leverages the code of MICROPY_COMP_CONST_FOLDING to support folding
of floating point constants.
If MICROPY_COMP_MODULE_CONST is defined as well, math module constants are
made available at compile time. For example:
_DEG_TO_GRADIANT = const(math.pi / 180)
_INVALID_VALUE = const(math.nan)
A few corner cases had to be handled:
- The float const folding code should not fold expressions resulting into
complex results, as the mpy parser for complex immediates has
limitations.
- The constant generation code must distinguish between -0.0 and 0.0, which
are different even if C consider them as ==.
This change removes previous limitations on the use of `const()`
expressions that would result in floating point number, so the test cases
of micropython/const_error have to be updated.
Additional test cases have been added to cover the new repr() code (from a
previous commit). A few other simple test cases have been added to handle
the use of floats in `const()` expressions, but the float folding code
itself is also tested when running general float test cases, as float
expressions often get resolved at compile-time (with this change).
Signed-off-by: Yoctopuce dev <dev@yoctopuce.com>
27 lines
978 B
Python
27 lines
978 B
Python
# test parsing of floats, requiring double-precision
|
|
|
|
# very large integer part with a very negative exponent should cancel out
|
|
print(float("9" * 400 + "e-100"))
|
|
print(float("9" * 400 + "e-200"))
|
|
print(float("9" * 400 + "e-400"))
|
|
|
|
# many fractional digits
|
|
print(float("." + "9" * 400))
|
|
print(float("." + "9" * 400 + "e100"))
|
|
print(float("." + "9" * 400 + "e-100"))
|
|
|
|
# tiny fraction with large exponent
|
|
print("%.14e" % float("." + "0" * 400 + "9e100"))
|
|
print("%.14e" % float("." + "0" * 400 + "9e200"))
|
|
print("%.14e" % float("." + "0" * 400 + "9e400"))
|
|
|
|
# ensure that accuracy is retained when value is close to a subnormal
|
|
print(float("1.00000000000000000000e-307"))
|
|
print(float("10.0000000000000000000e-308"))
|
|
print(float("100.000000000000000000e-309"))
|
|
|
|
# ensure repr() adds an extra digit when needed for accurate parsing
|
|
print(float(repr(float("2.0") ** 100)) == float("2.0") ** 100)
|
|
|
|
# ensure repr does not add meaningless extra digits (1.234999999999)
|
|
print(repr(1.2345))
|