summaryrefslogtreecommitdiffstatshomepage
path: root/py/objcomplex.c
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2017-04-04 11:57:21 +1000
committerDamien George <damien.p.george@gmail.com>2017-04-04 11:57:21 +1000
commit19f2e47d59b539f94a49137c379c88f0aed53cf1 (patch)
tree6a98daea2ea1ee8006cfe0dc051c821664b8b76c /py/objcomplex.c
parentbb296482c385d51f1eb8041e18beb5aa9668637c (diff)
downloadmicropython-19f2e47d59b539f94a49137c379c88f0aed53cf1.tar.gz
micropython-19f2e47d59b539f94a49137c379c88f0aed53cf1.zip
py: Add very simple but correct hashing for float and complex numbers.
Hashing of float and complex numbers that are exact (real) integers should return the same integer hash value as hashing the corresponding integer value. Eg hash(1), hash(1.0) and hash(1+0j) should all be the same (this is how Python is specified: if x==y then hash(x)==hash(y)). This patch implements the simplest way of doing float/complex hashing by just converting the value to int and returning that value.
Diffstat (limited to 'py/objcomplex.c')
-rw-r--r--py/objcomplex.c1
1 files changed, 1 insertions, 0 deletions
diff --git a/py/objcomplex.c b/py/objcomplex.c
index 8118fb8138..7ec47edb5b 100644
--- a/py/objcomplex.c
+++ b/py/objcomplex.c
@@ -117,6 +117,7 @@ STATIC mp_obj_t complex_unary_op(mp_uint_t op, mp_obj_t o_in) {
mp_obj_complex_t *o = MP_OBJ_TO_PTR(o_in);
switch (op) {
case MP_UNARY_OP_BOOL: return mp_obj_new_bool(o->real != 0 || o->imag != 0);
+ case MP_UNARY_OP_HASH: return MP_OBJ_NEW_SMALL_INT(mp_float_hash(o->real) ^ mp_float_hash(o->imag));
case MP_UNARY_OP_POSITIVE: return o_in;
case MP_UNARY_OP_NEGATIVE: return mp_obj_new_complex(-o->real, -o->imag);
default: return MP_OBJ_NULL; // op not supported