diff options
author | Paul Sokolovsky <pfalcon@users.sourceforge.net> | 2014-12-30 00:22:10 +0200 |
---|---|---|
committer | Paul Sokolovsky <pfalcon@users.sourceforge.net> | 2014-12-30 00:22:50 +0200 |
commit | 12033df511a5a5f0237a764379aacfbceb6c45dd (patch) | |
tree | 226ec32b42cfa23f51ce55e3b82a03b08e46714b /py/objint_mpz.c | |
parent | e3fa8278b45447b9e099e896bb24a84bb79e4cf0 (diff) |
py: Partially fix float to int conversion.
This fixes conversion when float type has more mantissa bits than small int,
and float value has small exponent. This is for example the case of 32-bit
platform using doubles, and converting value of time.time(). Conversion of
floats with larg exponnet is still not handled correctly.
Diffstat (limited to 'py/objint_mpz.c')
-rw-r--r-- | py/objint_mpz.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/py/objint_mpz.c b/py/objint_mpz.c index 5480bd385..1dc1def33 100644 --- a/py/objint_mpz.c +++ b/py/objint_mpz.c @@ -41,6 +41,10 @@ #include "runtime0.h" #include "runtime.h" +#if MICROPY_PY_BUILTINS_FLOAT +#include <math.h> +#endif + #if MICROPY_LONGINT_IMPL == MICROPY_LONGINT_IMPL_MPZ #if MICROPY_PY_SYS_MAXSIZE @@ -298,6 +302,14 @@ mp_obj_t mp_obj_new_int_from_uint(mp_uint_t value) { return mp_obj_new_int_from_ll(value); } +#if MICROPY_PY_BUILTINS_FLOAT +mp_obj_t mp_obj_new_int_from_float(mp_float_t val) { + // TODO: This doesn't handle numbers with large exponent + long long i = MICROPY_FLOAT_C_FUN(trunc)(val); + return mp_obj_new_int_from_ll(i); +} +#endif + mp_obj_t mp_obj_new_int_from_str_len(const char **str, mp_uint_t len, bool neg, mp_uint_t base) { mp_obj_int_t *o = mp_obj_int_new_mpz(); mp_uint_t n = mpz_set_from_str(&o->mpz, *str, len, neg, base); |