summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2017-03-24 10:40:25 +1100
committerDamien George <damien.p.george@gmail.com>2017-03-24 11:00:45 +1100
commit125eae1ba3c59b882fc95c82c95dccd2d93ceaa1 (patch)
tree138c06938686efa732f61672ec6e2545633221d8
parentfb161aa45a8110d18b08efa3175027b8fbac5463 (diff)
downloadmicropython-125eae1ba3c59b882fc95c82c95dccd2d93ceaa1.tar.gz
micropython-125eae1ba3c59b882fc95c82c95dccd2d93ceaa1.zip
py/modbuiltins: For round() builtin use nearbyint instead of round.
The C nearbyint function has exactly the semantics that Python's round() requires, whereas C's round() requires extra steps to handle rounding of numbers half way between integers. So using nearbyint reduces code size and potentially eliminates any source of errors in the handling of half-way numbers. Also, bare-metal implementations of nearbyint can be more efficient than round, so further code size is saved (and efficiency improved). nearbyint is provided in the C99 standard so it should be available on all supported platforms.
-rw-r--r--esp8266/Makefile2
-rw-r--r--py/modbuiltins.c11
-rw-r--r--qemu-arm/Makefile2
-rw-r--r--stmhal/Makefile2
4 files changed, 5 insertions, 12 deletions
diff --git a/esp8266/Makefile b/esp8266/Makefile
index 4710f4cdc2..28dbf08a64 100644
--- a/esp8266/Makefile
+++ b/esp8266/Makefile
@@ -108,7 +108,7 @@ LIB_SRC_C = $(addprefix lib/,\
libc/string0.c \
libm/math.c \
libm/fmodf.c \
- libm/roundf.c \
+ libm/nearbyintf.c \
libm/ef_sqrt.c \
libm/kf_rem_pio2.c \
libm/kf_sin.c \
diff --git a/py/modbuiltins.c b/py/modbuiltins.c
index 13312d2296..541e733e5a 100644
--- a/py/modbuiltins.c
+++ b/py/modbuiltins.c
@@ -473,18 +473,11 @@ STATIC mp_obj_t mp_builtin_round(size_t n_args, const mp_obj_t *args) {
mp_float_t val = mp_obj_get_float(o_in);
mp_float_t mult = MICROPY_FLOAT_C_FUN(pow)(10, num_dig);
// TODO may lead to overflow
- mp_float_t rounded = MICROPY_FLOAT_C_FUN(round)(val * mult) / mult;
+ mp_float_t rounded = MICROPY_FLOAT_C_FUN(nearbyint)(val * mult) / mult;
return mp_obj_new_float(rounded);
}
mp_float_t val = mp_obj_get_float(o_in);
- mp_float_t rounded = MICROPY_FLOAT_C_FUN(round)(val);
- mp_int_t r = rounded;
- // make rounded value even if it was halfway between ints
- if (val - rounded == 0.5) {
- r = (r + 1) & (~1);
- } else if (val - rounded == -0.5) {
- r &= ~1;
- }
+ mp_float_t rounded = MICROPY_FLOAT_C_FUN(nearbyint)(val);
#else
mp_int_t r = mp_obj_get_int(o_in);
#endif
diff --git a/qemu-arm/Makefile b/qemu-arm/Makefile
index e8f5b359ef..d4bbe8d583 100644
--- a/qemu-arm/Makefile
+++ b/qemu-arm/Makefile
@@ -47,7 +47,7 @@ SRC_TEST_C = \
LIB_SRC_C = $(addprefix lib/,\
libm/math.c \
libm/fmodf.c \
- libm/roundf.c \
+ libm/nearbyintf.c \
libm/ef_sqrt.c \
libm/kf_rem_pio2.c \
libm/kf_sin.c \
diff --git a/stmhal/Makefile b/stmhal/Makefile
index 3eef6ffb23..51aa07f3c9 100644
--- a/stmhal/Makefile
+++ b/stmhal/Makefile
@@ -86,7 +86,7 @@ SRC_LIB = $(addprefix lib/,\
libm/atanf.c \
libm/atan2f.c \
libm/fmodf.c \
- libm/roundf.c \
+ libm/nearbyintf.c \
libm/log1pf.c \
libm/acoshf.c \
libm/asinhf.c \