diff options
author | Dan Ellis <dan.ellis@gmail.com> | 2022-07-12 09:48:38 -0400 |
---|---|---|
committer | Damien George <damien@micropython.org> | 2022-07-26 22:23:47 +1000 |
commit | f9cbe6bc47dd4f5b8e85178caecd6f0de22b4c34 (patch) | |
tree | 7e4e3ad1a60aecb364528e609fddb3721fdb5af8 /tests/float/float_format_ints_doubleprec.py | |
parent | b22abcdbbedb0f7583b19031fd65e19b3883671d (diff) | |
download | micropython-f9cbe6bc47dd4f5b8e85178caecd6f0de22b4c34.tar.gz micropython-f9cbe6bc47dd4f5b8e85178caecd6f0de22b4c34.zip |
py/formatfloat: Format all whole-number floats exactly.
Formerly, py/formatfloat would print whole numbers inaccurately with
nonzero digits beyond the decimal place. This resulted from its strategy
of successive scaling of the argument by 0.1 which cannot be exactly
represented in floating point. The change in this commit avoids scaling
until the value is smaller than 1, so all whole numbers print with zero
fractional part.
Fixes issue #4212.
Signed-off-by: Dan Ellis dan.ellis@gmail.com
Diffstat (limited to 'tests/float/float_format_ints_doubleprec.py')
-rw-r--r-- | tests/float/float_format_ints_doubleprec.py | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/tests/float/float_format_ints_doubleprec.py b/tests/float/float_format_ints_doubleprec.py new file mode 100644 index 0000000000..57899d6d65 --- /dev/null +++ b/tests/float/float_format_ints_doubleprec.py @@ -0,0 +1,15 @@ +# Test formatting of very large ints. +# Relies on double-precision floats. + +import array +import sys + +# Challenging way to express 1e200 and 1e100. +print("{:.12e}".format(float("9" * 400 + "e-200"))) +print("{:.12e}".format(float("9" * 400 + "e-300"))) + +# These correspond to the binary representation of 1e200 in float64s: +v1 = 0x54B249AD2594C37D # 1e100 +v2 = 0x6974E718D7D7625A # 1e200 +print("{:.12e}".format(array.array("d", v1.to_bytes(8, sys.byteorder))[0])) +print("{:.12e}".format(array.array("d", v2.to_bytes(8, sys.byteorder))[0])) |