From a8e60c1fdee248bda55e9e6e718e05d78c93e115 Mon Sep 17 00:00:00 2001 From: Paul Sokolovsky Date: Mon, 31 Mar 2014 01:38:25 +0300 Subject: objfloat: Missing default: caused incorrect results for unimplemented ops. --- py/objfloat.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'py/objfloat.c') diff --git a/py/objfloat.c b/py/objfloat.c index babc0c479..5e4d05f17 100644 --- a/py/objfloat.c +++ b/py/objfloat.c @@ -119,7 +119,8 @@ mp_obj_t mp_obj_float_binary_op(int op, mp_float_t lhs_val, mp_obj_t rhs_in) { case MP_BINARY_OP_LESS_EQUAL: return MP_BOOL(lhs_val <= rhs_val); case MP_BINARY_OP_MORE_EQUAL: return MP_BOOL(lhs_val >= rhs_val); - return NULL; // op not supported + default: + return NULL; // op not supported } return mp_obj_new_float(lhs_val); } -- cgit v1.2.3 From 864038dab78afb01d7736faae0de58510d40e7c1 Mon Sep 17 00:00:00 2001 From: Paul Sokolovsky Date: Mon, 31 Mar 2014 02:12:40 +0300 Subject: objfloat: Make sure that floats always have dot (for C "double" type case). This matches CPython behavior and hopefully can be treated as general Python semantics. --- py/objfloat.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) (limited to 'py/objfloat.c') diff --git a/py/objfloat.c b/py/objfloat.c index 5e4d05f17..d8ac96c0b 100644 --- a/py/objfloat.c +++ b/py/objfloat.c @@ -1,4 +1,6 @@ #include +#include +#include #include #include @@ -23,7 +25,13 @@ STATIC void float_print(void (*print)(void *env, const char *fmt, ...), void *en format_float(o->value, buf, sizeof(buf), 'g', 6, '\0'); print(env, "%s", buf); #else - print(env, "%.8g", (double) o->value); + char buf[32]; + sprintf(buf, "%.8g", (double) o->value); + print(env, buf); + if (strchr(buf, '.') == NULL) { + // Python floats always have decimal point + print(env, ".0"); + } #endif } -- cgit v1.2.3 From 96ed213320cb627c1df7ea8550b86b0bba5cb559 Mon Sep 17 00:00:00 2001 From: Paul Sokolovsky Date: Mon, 31 Mar 2014 02:18:09 +0300 Subject: objfloat: Quick&dirty implementation of float floor division. TODO: Likely doesn't match Python semantics for negative numbers. --- py/objfloat.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'py/objfloat.c') diff --git a/py/objfloat.c b/py/objfloat.c index d8ac96c0b..3916c340b 100644 --- a/py/objfloat.c +++ b/py/objfloat.c @@ -111,13 +111,15 @@ mp_obj_t mp_obj_float_binary_op(int op, mp_float_t lhs_val, mp_obj_t rhs_in) { case MP_BINARY_OP_INPLACE_SUBTRACT: lhs_val -= rhs_val; break; case MP_BINARY_OP_MULTIPLY: case MP_BINARY_OP_INPLACE_MULTIPLY: lhs_val *= rhs_val; break; - /* TODO floor(?) the value + // TODO: verify that C floor matches Python semantics case MP_BINARY_OP_FLOOR_DIVIDE: - case MP_BINARY_OP_INPLACE_FLOOR_DIVIDE: val = lhs_val / rhs_val; break; - */ + case MP_BINARY_OP_INPLACE_FLOOR_DIVIDE: + lhs_val = MICROPY_FLOAT_C_FUN(floor)(lhs_val / rhs_val); + goto check_zero_division; case MP_BINARY_OP_TRUE_DIVIDE: case MP_BINARY_OP_INPLACE_TRUE_DIVIDE: lhs_val /= rhs_val; +check_zero_division: if (isinf(lhs_val)){ // check for division by zero nlr_jump(mp_obj_new_exception_msg(&mp_type_ZeroDivisionError, "float division by zero")); } -- cgit v1.2.3