diff options
author | David Steinberg <david.steinberg.dev@gmail.com> | 2015-01-13 15:22:30 +0000 |
---|---|---|
committer | Damien George <damien.p.george@gmail.com> | 2015-01-24 20:54:28 +0000 |
commit | 0fb17f6ef46ade018a3fda8d4266f15638ddf5e3 (patch) | |
tree | b2ba0a8b7c20d203577ddf3ca48b6c1f1a3eed24 /py/objint.c | |
parent | ca377b10de006b48f75383664f5f765b202412df (diff) |
py: Use float-to-int classifications for mp_obj_new_int_from_float() functions
Diffstat (limited to 'py/objint.c')
-rw-r--r-- | py/objint.c | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/py/objint.c b/py/objint.c index 370c6a5df..fd0b2be55 100644 --- a/py/objint.c +++ b/py/objint.c @@ -306,9 +306,19 @@ mp_obj_t mp_obj_new_int_from_uint(mp_uint_t value) { #if MICROPY_PY_BUILTINS_FLOAT mp_obj_t mp_obj_new_int_from_float(mp_float_t val) { - // TODO raise an exception if the int won't fit - mp_int_t i = MICROPY_FLOAT_C_FUN(trunc)(val); - return mp_obj_new_int(i); + int cl = fpclassify(val); + if (cl == FP_INFINITE) { + nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OverflowError, "can't convert inf to int")); + } else if (cl == FP_NAN) { + nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ValueError, "can't convert NaN to int")); + } else { + mp_fp_as_int_class_t icl = mp_classify_fp_as_int(val); + if (icl == MP_FP_CLASS_FIT_SMALLINT) { + return MP_OBJ_NEW_SMALL_INT((mp_int_t)val); + } else { + nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ValueError, "float too big")); + } + } } #endif |