summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/float/float_format_ftoe.py4
-rw-r--r--tests/float/float_format_ftoe.py.exp1
-rw-r--r--tests/float/float_format_ints.py31
-rw-r--r--tests/float/float_format_ints_doubleprec.py15
-rwxr-xr-xtests/run-tests.py1
5 files changed, 52 insertions, 0 deletions
diff --git a/tests/float/float_format_ftoe.py b/tests/float/float_format_ftoe.py
new file mode 100644
index 000000000..bc4e5a4a5
--- /dev/null
+++ b/tests/float/float_format_ftoe.py
@@ -0,0 +1,4 @@
+# check a case where rounding was suppressed inappropriately when "f" was
+# promoted to "e" for large numbers.
+v = 8.888e32
+print("%.2f" % v) # '%.2f' format with e32 becomes '%.2e', expect 8.89e+32.
diff --git a/tests/float/float_format_ftoe.py.exp b/tests/float/float_format_ftoe.py.exp
new file mode 100644
index 000000000..f8b1deb3e
--- /dev/null
+++ b/tests/float/float_format_ftoe.py.exp
@@ -0,0 +1 @@
+8.89e+32
diff --git a/tests/float/float_format_ints.py b/tests/float/float_format_ints.py
new file mode 100644
index 000000000..0bf4baf12
--- /dev/null
+++ b/tests/float/float_format_ints.py
@@ -0,0 +1,31 @@
+# Test that integers format to exact values.
+
+for b in [13, 123, 457, 23456]:
+ for r in range(1, 10):
+ e_fmt = "{:." + str(r) + "e}"
+ f_fmt = "{:." + str(r) + "f}"
+ g_fmt = "{:." + str(r) + "g}"
+ for e in range(0, 5):
+ f = b * (10**e)
+ title = str(b) + " x 10^" + str(e)
+ print(title, "with format", e_fmt, "gives", e_fmt.format(f))
+ print(title, "with format", f_fmt, "gives", f_fmt.format(f))
+ print(title, "with format", g_fmt, "gives", g_fmt.format(f))
+
+# Check that powers of 10 (that fit in float32) format correctly.
+for i in range(31):
+ # It works to 12 digits on all platforms *except* qemu-arm, where
+ # 10^11 comes out as 10000000820 or something.
+ print("{:.7g}".format(float("1e" + str(i))))
+
+# 16777215 is 2^24 - 1, the largest integer that can be completely held
+# in a float32.
+print("{:f}".format(16777215))
+# 4294967040 = 16777215 * 128 is the largest integer that is exactly
+# represented by a float32 and that will also fit within a (signed) int32.
+# The upper bound of our integer-handling code is actually double this,
+# but that constant might cause trouble on systems using 32 bit ints.
+print("{:f}".format(2147483520))
+# Very large positive integers can be a test for precision and resolution.
+# This is a weird way to represent 1e38 (largest power of 10 for float32).
+print("{:.6e}".format(float("9" * 30 + "e8")))
diff --git a/tests/float/float_format_ints_doubleprec.py b/tests/float/float_format_ints_doubleprec.py
new file mode 100644
index 000000000..57899d6d6
--- /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]))
diff --git a/tests/run-tests.py b/tests/run-tests.py
index baab7bdd4..2745ee139 100755
--- a/tests/run-tests.py
+++ b/tests/run-tests.py
@@ -516,6 +516,7 @@ def run_tests(pyb, tests, args, result_dir, num_threads=1):
if upy_float_precision < 64:
skip_tests.add("float/float_divmod.py") # tested by float/float_divmod_relaxed.py instead
skip_tests.add("float/float2int_doubleprec_intbig.py")
+ skip_tests.add("float/float_format_ints_doubleprec.py")
skip_tests.add("float/float_parse_doubleprec.py")
if not has_complex: